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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 219, средняя оценка - 4.68
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 21:09     [C++] Работа с файлами #1
Задача: Есть файлы, которые надо обработать:
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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Artishok
17.06.2010, 21:12
  #2

Не по теме:

ну обычно изучают Си или другой язык как минимум семестр

Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 21:27  [ТС]     [C++] Работа с файлами #3
ну хотя бы посоветуйте что для этого можно использовать какие функции?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
17.06.2010, 22:02     [C++] Работа с файлами #4
1.просканировать директории на наличие файлов расширения *.TXT
По этому вопросу есть не много инфы:
Работа с каталогами
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 22:12  [ТС]     [C++] Работа с файлами #5
спасибо, уже хоть чтото
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
 
#include "windows.h"
#include "iostream"
#include "string"
 
using namespace std;
 
void main()
{
 
string Path = "C:\\";       //для пути файла.
 
 
 
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
 
        hf=FindFirstFile("C:\\*.txt", &FindFileData);
 
    //Код расположенный ниже ищет все файлы с рашсширением .txt.
 
 
        if (hf!=INVALID_HANDLE_VALUE)
        {
                do
                {  
 
                Path  += FindFileData.cFileName;                        //создаеться полный путь сцеплением.
            cout << "Path file:  "<<Path.c_str()<<endl;             //выводим путь файла.
                cout << "Name file:  "<<FindFileData.cFileName<< endl;  //выводим имя файла.
/*путь файла можно использовать для отркрытия файла.   */               
                Path = "C:\\";   //сбрасываем путь.
 
                cout<<endl;
                }
 
                while (FindNextFile(hf,&FindFileData)!=0);
 
 
                FindClose(hf);
        }
 
 
 
system("pause");
}
а как просканировать вложенные директории? (вроде бы надо определить файл или папка)
и как вывести этот список в файл?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
17.06.2010, 22:40     [C++] Работа с файлами #6
а как просканировать вложенные директории?
Тогда скорее всего надо изобрести какой нибудь рекурсивный алгоритм обхода каталогов,
потому как если анализировать суть поиска: мы будем упираться в бесконечность, и
в возможность вернуться назад.
Толкового совета, дать не могу, потому как, не работал с этим, это только предположения.

и как вывести этот список в файл?
Это не трудно, на примере данном выше, могу это показать.

Добавлено через 8 минут
Egeni:
поповду обхода каталогов могу посоветовать набрать в гугол:
"рекурсивный обход каталогов FindFirstFile C++"
Вроде есть полезные ссылки.
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 22:54  [ТС]     [C++] Работа с файлами #7
вот нашел статью, но я незнаю, что мне из этого может быть полезно и как это можно использовать

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
HANDLE FindFirstFile(LPCTSTR lpFileName, //имя файла(ов) который(е) ищем, можно
 использовать маску (*,?)
LPWIN32_FIND_DATA lpFindFileData //структура которая будет содержит информацию о файле);
 
Если произошла ошибка, то функция вернет значение INVALID_HANDLE_VALUE, иначе handle
поиска.
 
Структура WIN32_FIND_DATA содержит следующие элементы:
 
dwFileAttributes – атрибуты файла(директории):
 
FILE_ATTRIBUTE_ARCHIVE 0x00000020 файл или директория архивные
FILE_ATTRIBUTE_COMPRESSED 0x00000800 файл или директория сжаты
FILE_ATTRIBUTE_DIRECTORY 0x00000010 каталог
FILE_ATTRIBUTE_ENCRYPTED 0x00000040 файл или директория зашифрованы
FILE_ATTRIBUTE_HIDDEN 0x00000002 файл или директория скрыты
FILE_ATTRIBUTE_NORMAL 0x00000080 файл или директория без атрибутов
FILE_ATTRIBUTE_READONLY 0x00000001 только чтение
FILE_ATTRIBUTE_SYSTEM 0x00000004 файл или директория системные
FILE_ATTRIBUTE_TEMPORARY 0x00000100 файл или директория временные
 
ftCreationTime – время создания
ftLastAccessTime – время последнего открытия
ftLastWriteTime – время последнего изменения
nFileSizeLow – размер файла 
cFileName – имя файла
 
Для продолжения поиска необходима функция FindNextFile:
 
BOOL FindNextFile( HANDLE hFindFile, //handle поиска
LPWIN32_FIND_DATA lpFindFileData //указатель на структуру с информацией о файле);
 
Если нет ошибок функция возвращает не нулевое значение. Для нахождения текущей директории
можно воспользоваться функцией GetCurrentDirectory:
 
DWORD GetCurrentDirectory(DWORD nBufferLength, //размер буфера
LPTSTR lpBuffer //указатель на буфер );
 
Теперь сам код, используется Visual C++ 6.0, создаем Win32 Console Application.
 
#include <iostream.h>
#include <windows.h>
 
 
int main()
{
WIN32_FIND_DATA winFileData;
HANDLE hFile;
char szPath[MAX_PATH];
if(GetCurrentDirectory(sizeof(szPath),szPath))
{
cout<<szPath<<endl;
lstrcat(szPath,"\\*.*");
hFile = FindFirstFile(szPath,&winFileData);
if (hFile!=INVALID_HANDLE_VALUE)
{
do
{
cout<<winFileData.cFileName<<endl; 
}
while (FindNextFile(hFile,&winFileData)!=0);
FindClose(hFile);
}
}
return 0;
}
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
17.06.2010, 23:02     [C++] Работа с файлами #8
1.просканировать директории на наличие файлов расширения *.TXT
Если просканировать все каталоги,
то надо, искать алгоритм обхода дерева каталогов.
Если сканировать определенные каталоги, то тебе найденной тобой информации вполне достаточно.
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 23:14  [ТС]     [C++] Работа с файлами #9
как просканировать допустим все файлы в поддиректориях
если сама программа будет находится в library

чтобы в booklist.txt собралась информация вида
C:\library\readme.txt
C:\library\book\11234123.txt
C:\library\book\12343123.txt

Добавлено через 3 минуты
вот еще нашел

Как добавить один файл к другому
Код
Следующий пример добавлет один файл в конец другого. Приложение открывает два файла функцией CreateFile: ONE.TXT открывается для чтения, а TWO.TXT - для записи. Затем, содержимое ONE.TXT добавляется в конец TWO.TXT путём чтения и записи блоками по 4K при помощи функций ReadFile и WriteFile. Перед записью во второй файл, приложение устанавливает указатель в файле на конец функцией SetFilePointer и блокирует область, которая будет записана функцией LockFile. Тем самым другим процессам будет закрыт доступ во время записи. После каждой операции записи, функцией UnlockFile область разблокируется.
HANDLE hFile;
HANDLE hAppend;
DWORD dwBytesRead, dwBytesWritten, dwPos;
char buff[4096];

// Открываем существующий файл.

hFile = CreateFile("ONE.TXT", // открываем ONE.TXT
GENERIC_READ, // открываем на чтение
0, // не доступен для других
NULL, // нет security
OPEN_EXISTING, // только существующий файл
FILE_ATTRIBUTE_NORMAL, // нормальный файл
NULL); // нет шаблона аттрибутов

if (hFile == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open ONE."); // обрабатываем ошибку
}

// Открываем существующий файл, либо если файл не существует,
// то создаём новый.

hAppend = CreateFile("TWO.TXT", // открываем TWO.TXT
GENERIC_WRITE, // открываем на запись
0, // не доступен для других
NULL, // нет security
OPEN_ALWAYS, // открыть или создать
FILE_ATTRIBUTE_NORMAL, // нормальный файл
NULL); // нет шаблона аттрибутов

if (hAppend == INVALID_HANDLE_VALUE)
{
ErrorHandler("Could not open TWO."); // обрабатываем ошибку
}

// Добавляем первый файл в конец второго.
// Блокируем второй файл во время записи в него, чтобы другие
// процессы в это время ничего не смогли сделать с файлом. Когда
// запись завершена, то разблокируем файл.

do
{
if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL))
{
dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
LockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
WriteFile(hAppend, buff, dwBytesRead,
&dwBytesWritten, NULL);
UnlockFile(hAppend, dwPos, 0, dwPos + dwBytesRead, 0);
}
} while (dwBytesRead == 4096);

// Закрываем оба файла.

CloseHandle(hFile);
CloseHandle(hAppend);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.06.2010, 23:44     [C++] Работа с файлами #10
Что-то вроде этого
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
#include <stdio.h>
#include <string.h>
#include <dir.h>
 
int main(void)
{
   struct ffblk file_info;
   int done;
   char dir[255];
   char mask[259];
   FILE *file_out;
 
   file_out = fopen("booklist.txt", "w");
   printf("Enter directory: ");
   gets(dir);
   strcpy(mask, dir);
   strcat(mask, "\\*.txt");
   printf("Directory listing of %s\n", mask);
   done = findfirst(mask, &file_info, 0);
   while (!done)
   {
      fprintf(file_out, "%s\\%s\n", dir, file_info.ff_name);
      done = findnext(&file_info);
   }
   getchar();
   return 0;
}
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
17.06.2010, 23:49  [ТС]     [C++] Работа с файлами #11
dir.h незнает таких, что входит в его состав?
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
17.06.2010, 23:54     [C++] Работа с файлами #12
Цитата Сообщение от Egeni Посмотреть сообщение
dir.h незнает таких, что входит в его состав?
В него входят функции для работы с каталогами.
Grey
Тутошний я
 Аватар для Grey
1435 / 619 / 23
Регистрация: 03.11.2009
Сообщений: 1,600
18.06.2010, 00:08     [C++] Работа с файлами #13
Egeni, раз нада ,держи. И надеюсь понимаеш разницу между C++ и C++Builder.
1 Поиск файла
3
C++
1
Memo1->Lines->LoadFromFile("booklist.txt");
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 00:08  [ТС]     [C++] Работа с файлами #14
прочитал в инете dir.h в Visual C++ (которым я пользуюсь) нету, он есть в C++ Builder скачал я с него закинул но VС++ не хочет его понимать
Код
fatal error C1083: Cannot open include file: 'dir.h': No such file or directory
Grey
Тутошний я
 Аватар для Grey
1435 / 619 / 23
Регистрация: 03.11.2009
Сообщений: 1,600
18.06.2010, 00:23     [C++] Работа с файлами #15
Это на C++. Поиск файла
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 01:06  [ТС]     [C++] Работа с файлами #16
для предыдущего кода необходима либа dir.h, которой в VC++ нету, а в борланде билдере С++ есть

но они не подходят друг для друга, что делать?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
18.06.2010, 09:50     [C++] Работа с файлами #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  [ТС]     [C++] Работа с файлами #18
Скомпилил я сей замечательный код в разных компиляторах

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

по общим файлам проекта
MSVC++ 4.41 МБ
Borland С++ 992КБ
очень наглядно... видно что от микрософт отстойный компилятор
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.06.2010, 11:57     [C++] Работа с файлами #19
Egeni, в борланде зайди в Свойства проекта и на вкладке Линкер убери галочку Use dynamic RTL, хотя согласен VC много лишнего кода генерирует.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2010, 12:20     [C++] Работа с файлами
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
18.06.2010, 12:20  [ТС]     [C++] Работа с файлами #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
помойму перезаписывает... как быть?
Yandex
Объявления
18.06.2010, 12:20     [C++] Работа с файлами
Ответ Создать тему
Опции темы

Текущее время: 04:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru