| 
	
		
		
			| Бесконечный массив |  |  |  | 
| 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 |  | частый гость Сейчас нет на сайте | спс   
 
   |  |  |  |  |  
 |