Понедельник, 25 Ноября 2024, 15:12

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Бесконечный массив
bond95Дата: Воскресенье, 26 Декабря 2010, 14:31 | Сообщение # 1
частый гость
Сейчас нет на сайте
Сделал пробную программу объединения файлов:
Code
//---------------------------------------------------------------------------

#pragma hdrstop
#include <stdio.h>
#include <iostream>
#include <fstream.h>
#include <conio.h>

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
   setlocale( LC_ALL,"Russian" );
   FILE *f;
   FILE *f2;
   FILE *f3;
   int scl;
   char *name;
   char *flag;
   char *name2;
   bool tof=true;
   name2="text.txt";
   f=fopen("text.txt","rb");
   f2=fopen("test2.txt","ab+");
   if((f3=fopen("test2.txt","r"))==NULL) {
    return 0;
   }
    while ( fgets(name,25,f3)!=NULL && strcmp(name,"text.txt")) {  //считывание файла до тех пор пока он не закончится
     if(!strcmp(name,"text.txt")) {
      std::cout<<"Такой файл уже существует, изменить имя? y/n";
      std::cin>>flag;
      if(strcmp(flag,"y")==0) {
       std::cin>>name2;
       tof=true;
      }
      else
      tof=false;
      }
      name=NULL;
}
if(tof) {
fputs("\n",f2);
fputs(name2,f2);
fputs("\n",f2);
   while((scl=fgetc(f))!=EOF) {
     fputc(scl,f2);
     scl=NULL;
   }
   }
   fclose(f);
   fclose(f2);
   return 0;
}
//---------------------------------------------------------------------------

Когда запускаю программу она до цикла работает нормально но когда начинается цикл он почему то стает бесконечным. Помогите найти ошибку.




Сообщение отредактировал bond95 - Воскресенье, 26 Декабря 2010, 14:31
DekaSoftДата: Воскресенье, 26 Декабря 2010, 16:14 | Сообщение # 2
почетный гость
Сейчас нет на сайте
Quote (bond95)
while ( fgets(name,25,f3)!=NULL && strcmp(name,"text.txt")) {...

Ты сам-то понимаешь смысл этой записи? Считываешь 25 байтов из потока f3 пока поток не закончится, помещаешь их в name, потом еще name сравниваешь с "text.txt". Бред какой-то вообще.... Даже непонятно, что ты имел ввиду.


http://dekasoftware.narod.ru
http://www.dekagames.com


Сообщение отредактировал DekaSoft - Воскресенье, 26 Декабря 2010, 16:14
bond95Дата: Воскресенье, 26 Декабря 2010, 16:30 | Сообщение # 3
частый гость
Сейчас нет на сайте
Мне нужно перед тем как вставить один файл в другой проверить вставленный ли этот файл или нет.

ArchidoДата: Воскресенье, 26 Декабря 2010, 17:00 | Сообщение # 4
Сэнсэй
Сейчас нет на сайте
bond95, что-то разбираться лень немнога :D, вот тебе примерчик:

Code

#include <stdio.h>  
#include <string.h>  

void ExtractFileName(char* FilePath, char* FileName) {

  strcpy_s(FileName, strlen(FilePath) + 1, FilePath); //копирует строки
}

struct FileInfo { //информация о файле
  char Name[64];  
  int Size;
};

int main(int argc, char* argv[]) {

  //используем коммандную строку, первый параметр - имя архива,  
  //последующие - имена файлов которые нужно скомпоновать

  //для теста
  argc = 3;  
  argv[0] = "arch.txt";
  argv[1] = "test1.txt";
  argv[2] = "test2.txt";

  int FileCount = argc - 1; //кол-во файлов, -1 т.к. архив не учитываем

  FILE* Result = NULL;  
  Result = fopen(argv[0], "wb"); //создаем архив
  fwrite(&FileCount, sizeof(FileCount), 1, Result); //пишем в начало кол-во файлов

  for (int i = 1; i <= FileCount; i++) { //цикл по всем файлам
   FILE* file = NULL;  
   file = fopen(argv[i], "rb");//открываем файл для чтения

   fseek(file, 0, SEEK_END);  
   int FileSize = ftell(file); //получаем его размер
   fseek(file, 0, SEEK_SET);

   FileInfo fInfo; //заполняем структуру
   ExtractFileName(argv[i], fInfo.Name); //копируем имя, ф-ция эта по задумке - вырезает из полного пути(если нужно) имя файла, при необходимости дописать(ща она тупо копирует)
    
   fInfo.Size = FileSize; //пишем размер

   fwrite(&fInfo, sizeof(FileInfo), 1, Result);//записываем все в наш архив
    
   const int BufSize = 16 * 1024; //размер буфера для копирования, можно и нужно делать его больше

   char Buf[BufSize]; //собсна буфер
    
   int Bytes = FileSize; //скольно нам надо записать байт
   while (Bytes > 0) {  
    int ToWrite = BufSize;
    if (Bytes - BufSize < 0) ToWrite = Bytes;//если осталось меньше размера буфера, то записываем скольно нужно

    fread(Buf, ToWrite, 1, file); //читаем файл в буфер
    fwrite(Buf, ToWrite, 1, Result);// пишем из буфера в архив
    Bytes -= ToWrite;  
   }
   fclose(file);
  }
  fclose(Result);

  return 0;
}

Думаю разберешься и допишешь под свои нужды.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
bond95Дата: Воскресенье, 26 Декабря 2010, 17:08 | Сообщение # 5
частый гость
Сейчас нет на сайте
Выдает ошибку в этой строке.
Quote (Archido)
strcpy_s(FileName, strlen(FilePath) + 1, FilePath); //копирует строки


ArchidoДата: Воскресенье, 26 Декабря 2010, 17:09 | Сообщение # 6
Сэнсэй
Сейчас нет на сайте
Мм? какая среда разработки? string.h подключен?

Code

strcpy(FileName, FilePath); //а если так?


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
bond95Дата: Воскресенье, 26 Декабря 2010, 20:09 | Сообщение # 7
частый гость
Сейчас нет на сайте
С++ builder

Добавлено (26.12.2010, 20:09)
---------------------------------------------
А как удалить файл с этого архива?


ArchidoДата: Понедельник, 27 Декабря 2010, 14:58 | Сообщение # 8
Сэнсэй
Сейчас нет на сайте
bond95, ну, в принципе, особо ничего сложного.
Проходишь по информации каждого файла, пока не найдешь нужный по имени. Когда нашел, то с текущей позиции в архиве смещаешь(на размер удаляемого файла + структура с информацией) все данные, которые идут после него.
И все собссна smile .


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
bond95Дата: Понедельник, 27 Декабря 2010, 16:53 | Сообщение # 9
частый гость
Сейчас нет на сайте
спс biggrin

  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг