Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 219, средняя оценка - 4.68
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
#1

[C++] Работа с файлами - C++

17.06.2010, 21:09. Просмотров 27604. Ответов 74
Метки нет (Все метки)

Задача: Есть файлы, которые надо обработать:
1.просканировать директории на наличие файлов расширения *.TXT
2.сохранять список путей к файлам в booklist.txt (для дальнейшей работы)
3.вывести booklist.txt на экран

Добавлено через 41 минуту
пытался найти похожие или хоть какие-то программы работы с файлами нашел вот эту

работает с файлами через аргумент и выводит дважды содержание файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Заголовочные файлы для ввода-вывода
#include <iostream>
#include <fstream>
 
void printFileTwice (const char* filename)
{
    // Открытие файла
    std::ifstream file(filename);
 
    // Первый вывод содержимого
    std::cout << file.rdbuf();
 
    // Возврат к началу файла
    file.seekg(0);
 
    // Второй вывод содержимого
    std::cout << file.rdbuf();
}
 
int main (int argc, char* argv[])
{
    // Двукратный вывод всех файлов, переданных в командной строке
    for (int i=1; i<argc; ++i) {
        printFileTwice(argv[i]);
    }
}
Добавлено через 16 минут
------------------------------------

Посоветуйте что можно сделать, я в С++ только начал
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2010, 21:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C++] Работа с файлами (C++):

работа с файлами - C++
Здравствуйте. Хотел бы получить небольшую помощь Задача есть конфиг в котором написаны ip-адреса на разных строчках пример: ... ...

Работа с файлами - C++
Программа полностью рабочая. Кроме одного момента. #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;clocale&gt;...

Работа с файлами - C++
Всем доброго времени суток) При написании программы возникла проблема.... не знаю как из одного файла в другой переписать некоторые...

Работа с файлами - C++
1) Преобразовать строку, заменяя каждую цифру соответствующим ей числом символов нижнего подчеркивания. Например: «3 слона» -&gt; «_ _ _слона»...

Си, работа с файлами - C++
помогите пожалуйста написать прогамму на Си, вот само задание: подготовьте текстовый файл, который состоит из строк, содержащих...

Работа с файлами - C++
создать файл, содержащие сведения о количестве изделий, собранных сборщиками цеха неделю. Каждая запись содержит поля: фамилия...

74
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 01:06  [ТС] #16
для предыдущего кода необходима либа dir.h, которой в VC++ нету, а в борланде билдере С++ есть

но они не подходят друг для друга, что делать?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,508
18.06.2010, 09:50 #17
Парень, вот тебе код, напиши вместо "С:" нужное тебе имя папки, скомпиль (у меня DEV C++ 4.9.9.2), запусти и получай все файлы exe, которые в ней есть. С именами директорий. Так, тебе надо *txt? Разберёшься сам, я думаю....

(Нормальные пацаны умеют задавать имя папки и расширение в консоли, кстати...)

...Сразу скажу, код не мой, а некоего Юры. Но я оригинал переработал и указал автору на некоторые ошибки. В этой теме. Так что я в некотором (думаю, немалом) смысле соавтор сей проги

...Чё за переменная rez, я забыл уже. Может, количество файлов? Кто его знает... В общем, вперёд, мой юный друг, покорять, тык скыть вершины олимпа!
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
        char sPath[MAX_PATH]= "C:";
 
//Обратить  внимание на размер массива!
        char sExt[10]= "exe";
        char sEXT[10]= "EXE";
        GetFileList(sPath, sExt, sEXT);
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
      printf("rez= %d\n", rez);
  system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
     if(strstr(chBuf + 1,sExt)|| strstr(chBuf + 1,sEXT)) {
      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
      CharToOem(sPath,sPath);
      printf("%s",sPath);
      OemToChar(sPath,sPath);
      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
      printf("%s\n",pFILEDATA.cFileName);
      rez++;
     }
    }
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
2
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 11:52  [ТС] #18
Скомпилил я сей замечательный код в разных компиляторах

По ехе'шнику
MSVC++ 161КБ
Borland С++ 9КБ

по общим файлам проекта
MSVC++ 4.41 МБ
Borland С++ 992КБ
очень наглядно... видно что от микрософт отстойный компилятор
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
18.06.2010, 11:57 #19
Egeni, в борланде зайди в Свойства проекта и на вкладке Линкер убери галочку Use dynamic RTL, хотя согласен VC много лишнего кода генерирует.
1
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 12:20  [ТС] #20
пробую не выходит вывести в файл... пытаюсь изменить предыдущий код
C++
1
2
3
4
5
6
/условие.../
          printf("%s\n",pFILEDATA.cFileName);
          rez++;
      FILE *out = fopen( "booklist.txt", "w" );
          fprintf( out, "%s\n", pFILEDATA.cFileName);
/.../
выводит две строчки какие-то обрезанные, видимо что-то не то делаю? во время выполнения программы пока программу не закроешь файл booklist.txt нулевой, а мне надо чтобы оно дописывало на строку ниже вида
C:\library\readme.txt
C:\library\book\11234123.txt
C:\library\book\12343123.txt
помойму перезаписывает... как быть?
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
18.06.2010, 12:26 #21
Для добавления записей в файл используй режим "a". Для сброса содержимого на диск во время работы программы и используй функцию fflush
C
1
fflush(out);
1
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,508
18.06.2010, 12:43 #22
Egeni, если ты про мой код, то при компиляции в DEV C++ 4.9.9.2 (очень рекомендую) выходит экзешник 19 кило. И всё.

Добавлено через 9 минут
...И да, всякий раз, дописываая нечто в файл, ты именно добавляешь, то есть "w" не канает (см. сообщение выше)

Вообще поразбирайся с режимами открытия и прочее. Не забудь использовать fclose ().

...А вообще неправильно это всё.
Объясняю.
Не след нам вякий раз открывать файл на добавление имени директории. Это неграмотно, хотя и сработает.
НАдо так: Создаёшь строку НУЖНОЙ длины, туда все имена директорий перегоняешь, потом ОДИН РАЗ открываешь файл на запись и туда перегоняешь эту строку с именами папок. ВСё.

Хотя я тут подумал... А какой длины тебе нужна будет стррока? Заранее ведь неизвестно. Может, ты и прав, что всякий раз перегоняешь имя папки сразу в файл. В общем, лень не будет, поразмысли.
1
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 12:54  [ТС] #23
а если файлов много, то мне кажется что данный алгоритм может загнуться при переполнении буфера или затормозиться очень сильно если не повиснуть вообще..

невыходит вывести путь к файлу программа находится в директории
я пишу
C++
1
2
3
4
      printf("%s\n",pFILEDATA.cFileName);
      rez++;
                FILE *out = fopen( "booklist.txt", "a" );
          fprintf( out, "sPath %s\n", pFILEDATA.cFileName);
и получаю в буклисте (после закрытия программы...)
sPath 2.txt
sPath 3.txt
sPath 4.txt

как привести к виду:
folder\2.txt
folder\3.txt
folder\4.txt
если файлы находятся в папке? а то оно просто сканируемые файлы скидывает


вот сама программа
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
        char sPath[MAX_PATH]= "Folder";
 
//Обратить  внимание на размер массива!
        char sExt[10]= "txt";
        char sEXT[10]= "TXT";
        GetFileList(sPath, sExt, sEXT);
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
      printf("rez= %d\n", rez);
  system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
     if(strstr(chBuf + 1,sExt)|| strstr(chBuf + 1,sEXT)) {
      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
      CharToOem(sPath,sPath);
      printf("%s",sPath);
      OemToChar(sPath,sPath);
      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
      printf("%s\n",pFILEDATA.cFileName);
      rez++;
                FILE *out = fopen( "booklist.txt", "a" );
          fprintf( out, "sPath %s\n", pFILEDATA.cFileName);
     }
    }
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
18.06.2010, 13:04 #24
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Egeni Посмотреть сообщение
а если файлов много, то мне кажется что данный алгоритм может загнуться при переполнении буфера или затормозиться очень сильно если не повиснуть вообще..
Переодически очищай буфер fflush'ем. На счет тормозов, если ты будешь сканировать весь диск, то естестввенно это займет некоторое время.

Цитата Сообщение от Egeni Посмотреть сообщение
как привести к виду:
folder\2.txt
folder\3.txt
folder\4.txt
если файлы находятся в папке? а то оно просто сканируемые файлы скидывает
Хранить в отдельной строке имя текущей директории. Далее
C
1
fprintf( out, "%s\\%s\n", cur_dir, pFILEDATA.cFileName);
1
rrrFer
Заблокирован
18.06.2010, 13:56 #25
C++
1
2
3
4
5
#include <stdlib.h>
int main(void){
    system("dir /s \"D:\\*.txt\" > \"full_ccal.txt\"");
    return 0;
}
в файле full_ccal.txt будут имена файлов .txt с диска D:\ примерно такого типа:
Содержимое папки D:\
18.06.2010 17:42 0 booklist.txt
18.06.2010 17:52 0 full_ccal.txt
18.06.2010 17:16 0 Текстовый документ (2).txt
18.06.2010 17:16 0 Текстовый документ.txt
4 файлов 0 байт
Содержимое папки D:\music\старое\Аида Ведищева-128 kbps\Аида Ведищева CD1
17.10.2009 19:41 506 Треклист.txt
1 файлов 506 байт
Содержимое папки D:\music\старое\Аида Ведищева-128 kbps\Аида Ведищева CD2
18.10.2009 00:34 384 Треклист.txt
1 файлов 384 байт
Дальше наверное надо распарсить файл. Чтобы не выводить лишнего - почитайте описание команды dir. И потом вывести файл на экран для этого можно использовать system("notepad file.txt");
Чтобы искать файлы не на диске D а в других каталогах - надо формировать строку для system() - т.е. вместо \"D:\\*.txt\" заводить что-то другое, надеюсь понятно как эта строка формироваться должна?
1
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 14:00  [ТС] #26
kazak, не выходит присвоение cur_dir немогу "декларировать переменную"

rrrFer, сейчас посмотрим
C++
1
2
3
4
5
#include<stdlib.h>
int main(void){
system("dir /s \"D:\\*.txt\" > \"full_ccal.txt\"");
return 0;
}
0
rrrFer
Заблокирован
18.06.2010, 14:01 #27
а почему если вставляю код не из блокнота, а из visual studio то вставляется что-то типа:
C++
1
2
3
4
5
6
7
[SIZE=1][COLOR=#ff00ff][SIZE=1][COLOR=#ff00ff]
#include[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0] [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ff00][SIZE=1][COLOR=#00ff00]<stdlib.h>
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ffff][SIZE=1][COLOR=#00ffff]int[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0] main([/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ffff][SIZE=1][COLOR=#00ffff]void[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0]){
system([/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ff00][SIZE=1][COLOR=#00ff00]"dir /s \"D:\\*.txt\" > \"full_ccal.txt\""[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0]);
[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ffff][SIZE=1][COLOR=#00ffff]return[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0] [/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#00ff00][SIZE=1][COLOR=#00ff00]0[/COLOR][/SIZE][/COLOR][/SIZE][SIZE=1][COLOR=#c0c0c0][SIZE=1][COLOR=#c0c0c0];
}
[/COLOR][/SIZE][/COLOR][/SIZE]
наверно потому что я в настройках форума выбрал не стандартный а какой-то другой редактор
0
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 14:08  [ТС] #28
на счет использования "системового дира" в файл выходит очень много чепухи, которую опять потом нужно обрабатывать, хотя и вариант простой;

хорошо тогда как парсить?
0
kazak
3051 / 2372 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
18.06.2010, 14:18 #29
Цитата Сообщение от Egeni Посмотреть сообщение
kazak, не выходит присвоение cur_dir немогу "декларировать переменную"
Весь твой листинг не видел, у тебя же sPath должен содержать путь к файлу.
fprintf( out, "%s\\%s\n", sPath, pFILEDATA.cFileName);
1
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 14:36  [ТС] #30
kazak, спасибо

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <windows.h>
#include <stdio.h>
 
long int rez= 0;
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT);
 
int main(){
 
//Поскольку sPath и sExt и sEXT одинаковы во всех вызовах GetFileList, их можно было бы сделать
//глобальными, но я так оставил. 
        char sPath[MAX_PATH]= "C:";
 
//Обратить  внимание на размер массива!
        char sExt[10]= "txt";
        char sEXT[10]= "TXT";
        GetFileList(sPath, sExt, sEXT);
//Портит всё дело: Если перенаправлять в файл с консоли, то полуачается, что в консол ведут 
//запись два разных потока- тот,который нужент и этот,который записывает "Для продлжения нажмите любую
//клавишу" и эта надпись вклинивается в серёдку и портит всё дело
      printf("rez= %d\n", rez);
  system ("PAUSE");
}
 
void GetFileList(LPTSTR sPath, LPTSTR sExt, LPTSTR sEXT) {
 
 WIN32_FIND_DATA pFILEDATA;
 
 HANDLE hFile = FindFirstFile(strcat(sPath,"\\*.*"),&pFILEDATA);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!Необходимо именно здесь прописывать длину пути!!!!!!!!!!!!!!!!!!!!!!!
 sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
//Если пропишем после if (как предлагает Юра), то тогда, если вдруг натыкаемся на системную директорию
// или файл, то FindFirstFile возвращает -1. Следовательно, всё, что выплнняется по условию
//(hFile!=INVALID_HANDLE_VALUE) не выолнится и в частности, не будет поставлен конец строки!
//А это значит, что по выходу из  рекурсивной функции GetFileList в том месте, где мы восстанавливаем
//Длину, она будет восстановлена неправильно
 if (hFile!=INVALID_HANDLE_VALUE)    {
  char * chBuf;
  //sPath[strlen(sPath) - strlen(strstr(sPath,"*.*"))] = '\0';
  do {
   //Пропускаем . и ..
   if (strlen(pFILEDATA.cFileName) == 1 &&  strchr(pFILEDATA.cFileName,'.') !=NULL)
    if (FindNextFile(hFile,&pFILEDATA) == 0)
      break;
   if (strlen(pFILEDATA.cFileName) == 2 && strstr(pFILEDATA.cFileName,"..") !=NULL)
    if(FindNextFile(hFile,&pFILEDATA) == 0)
      break;
     //Если нашли директорию, запускаем поиск в ней рекурсивный поиск
   if(pFILEDATA.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     GetFileList(strcat(sPath,pFILEDATA.cFileName), sExt, sEXT);
 
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!оБЯЗАТЕЛЬН востанавливать дллину пути................................     
     sPath[strlen(sPath) - strlen(pFILEDATA.cFileName)- 1] = '\0';
   }
   else {
    //Проверяем на соотвествие sExt расширения pFILEDATA.cFileName
    if((chBuf = strrchr(pFILEDATA.cFileName,'.'))) {
     if(strstr(chBuf + 1,sExt)|| strstr(chBuf + 1,sEXT)) {
      //Если не будем использовать CharToOem() то на экране русский шрифт каракулями выйдет
      CharToOem(sPath,sPath);
      printf("%s",sPath);
      OemToChar(sPath,sPath);
      CharToOem(pFILEDATA.cFileName,pFILEDATA.cFileName);
      printf("%s\n",pFILEDATA.cFileName);
      rez++;
                FILE *out = fopen( "booklist.txt", "a" );
                fprintf( out, "%s\%s\n", sPath, pFILEDATA.cFileName);     }
    }
   }
  }
  while (FindNextFile(hFile,&pFILEDATA));
 }
}
Вот общими усилиями собрали, работает, но выкидывает ошибку видимо при переполнении, как вы говорили fflush использовать?

Добавлено через 12 минут
Инструкция по адресу "0x7c901010" обратилась к памяти по адресу "0x00000034". Память не может быть "read"

7C901010 cmp dword ptr [edx+14h],0

Что делать?
0
18.06.2010, 14:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2010, 14:36
Привет! Вот еще темы с ответами:

Работа с файлами - C++
Доброго времени суток... Необходимо выполнить следующее задание: Найти сумму первых шести элементов массива и записать вместо...

Работа с файлами - C++
Создать файл, содержащий сведения о месячной заработной плате сотрудников отдела. Каждая запись содержит поля: фамилия со¬трудника,...

Работа с файлами - C++
Напишите пожалуйста программу ( с комментариями по возможности ) Информация об участниках спортивных соревнований содержит: ...

РАБОТА С ФАЙЛАМИ - C++
Пожалуйста объясните задачу, как её сделать? Создать текстовый файл с записями фиксированной длины. Файл содержит информацию об 10...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru