Бесконечный массив
| |
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, ну, в принципе, особо ничего сложного. Проходишь по информации каждого файла, пока не найдешь нужный по имени. Когда нашел, то с текущей позиции в архиве смещаешь(на размер удаляемого файла + структура с информацией) все данные, которые идут после него. И все собссна .
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
bond95 | Дата: Понедельник, 27 Декабря 2010, 16:53 | Сообщение # 9 |
частый гость
Сейчас нет на сайте
| спс
|
|
| |
|