Форум программистов, компьютерный форум CyberForum.ru

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

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

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

17.06.2010, 21:09. Просмотров 27188. Ответов 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 минут
------------------------------------

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

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

работа с файлами - C++
мне надо записать в файл данные, но чтобы не стирались записи, которые уже есть там

Работа с файлами - C++
помогите написать программу на си !Которая считывает текст из файла и выводит на экран предложения не содержащие запятых.

Работа с файлами - C++
К сожалению, не имею возможности обучаться методом проб и ошибок, потому оперирую теорией. FILE * bsp; bsp = fopen(bsp_c,&quot;rb&quot;); ...

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

Работа с файлами - C++
Здравствуйте! С помощью функции Cap_table() шапку таблицы. Теперь надо с новой строки под шапкой записывать данные. Используя fopen - wr+...

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

но они не подходят друг для друга, что делать?
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
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));
 }
}
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 11:52  [ТС] #18
Скомпилил я сей замечательный код в разных компиляторах

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

по общим файлам проекта
MSVC++ 4.41 МБ
Borland С++ 992КБ
очень наглядно... видно что от микрософт отстойный компилятор
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
18.06.2010, 11:57 #19
Egeni, в борланде зайди в Свойства проекта и на вкладке Линкер убери галочку Use dynamic RTL, хотя согласен VC много лишнего кода генерирует.
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
помойму перезаписывает... как быть?
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
18.06.2010, 12:26 #21
Для добавления записей в файл используй режим "a". Для сброса содержимого на диск во время работы программы и используй функцию fflush
C
1
fflush(out);
kravam
быдлокодер
1694 / 881 / 44
Регистрация: 04.06.2008
Сообщений: 5,441
18.06.2010, 12:43 #22
Egeni, если ты про мой код, то при компиляции в DEV C++ 4.9.9.2 (очень рекомендую) выходит экзешник 19 кило. И всё.

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

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

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

Хотя я тут подумал... А какой длины тебе нужна будет стррока? Заранее ведь неизвестно. Может, ты и прав, что всякий раз перегоняешь имя папки сразу в файл. В общем, лень не будет, поразмысли.
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));
 }
}
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 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);
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\" заводить что-то другое, надеюсь понятно как эта строка формироваться должна?
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;
}
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]
наверно потому что я в настройках форума выбрал не стандартный а какой-то другой редактор
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 14:08  [ТС] #28
на счет использования "системового дира" в файл выходит очень много чепухи, которую опять потом нужно обрабатывать, хотя и вариант простой;

хорошо тогда как парсить?
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
18.06.2010, 14:18 #29
Цитата Сообщение от Egeni Посмотреть сообщение
kazak, не выходит присвоение cur_dir немогу "декларировать переменную"
Весь твой листинг не видел, у тебя же sPath должен содержать путь к файлу.
fprintf( out, "%s\\%s\n", sPath, pFILEDATA.cFileName);
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

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

Работа с файлами - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt;//использую для функции getch-не дает закрываться программе #include...

Работа с файлами - C++
Задача программы такова - пользователь вводит строку адреса , например C:\blablabla и программа считывает все размеры файлов хранящихся в...

Работа с файлами - C++
тут две задачи по массивам)) подскажите почему не работают и как сделать так чтобы в файле ввсё это было(файл читал массивы, на первой...

Работа с файлами - C++
написать программу на языке программирования С++ для выполнения задания. Обработку массивов выполнять с помощью функций;


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.06.2010, 14:36
Ответ Создать тему
Опции темы

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