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

Подать несколько файлов на вход программе - C++

Восстановить пароль Регистрация
 
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
03.11.2012, 13:13     Подать несколько файлов на вход программе #1
Работаю в Студии, в Винде.
В случае, когда мы считываем из одного (текстового) файла информацию (текст типа string (построчно) или char (посимвольно)), и далее обрабатываем её в нашей программе всё понятно.
НО, что если обработать подобным образом нужно более одного файла, лежащих в одной директории (если кто напишет ещё что-нибудь про случай с разными директориями буду рад вдвойне) ....

ВОПРОС: Как подать программе на вход в цикле каждый файл для последующей обработки каждого файла соответственно?
Обрабатываются txt файлы, причём имеются 3 директории:
В первой файлы, названия которых идут от 001.txt до 100.txt
Во второй файлы, названия которых идут от aa.txt, ab.txt, ac.txt и т.д. до zx.txt, zy.txt, zz.txt
В третей файлы, в названиях которых содержатся 5 символов (случайно взятые латинские буквы и цифры в привольном порядке) произвольная_комбинация.txt
В каждой директории содержится минимум 100 файлов.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
03.11.2012, 14:43     Подать несколько файлов на вход программе #2
Цитата Сообщение от Omnio Посмотреть сообщение
В третей файлы, в названиях которых содержатся 5 символов (случайно взятые латинские буквы и цифры в привольном порядке) произвольная_комбинация.txt
Этот пункт посложнее будет, я бы реализовал так:

1) Нашёл бы имена всех НУЖНЫХ файлов в этой директории. Поместил бы их в вектор строк, например
vector <string> imena;
2) Потом бы циклом пробегался по этому вектору и проводил с файлом необходимые действия:
for (int i= 0; i< imena.size(); i++) {
//Тут необходимые дейтсвия
}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Второй способ заключается в том, чтобы не складировать имена файлов в вектор, а по нахождении очередного имени произвести с ним необходимые действия
C++
1
2
3
4
5
6
while (true) {
 if (нашёл имя)
  //Действия
 else
  //break;
}
"нашёл имя" означает, "нашёл имя необработанного файла". Как только все файлы будут обработаны, имя найдено НЕ БУДЕТ. Значит выполнится команда break, то есть выход из цикла.
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
03.11.2012, 18:54  [ТС]     Подать несколько файлов на вход программе #3
Цитата Сообщение от kravam Посмотреть сообщение
1) Нашёл бы имена всех НУЖНЫХ файлов в этой директории. Поместил бы их в вектор строк, например
vector <string> imena;
Мне нужен не алгоритм действий. А чтобы вы показали на каких-нибудь небольших примерах как производится поиск имён файлов в директории в принципе. И как их названия можно помещать в вектор строк. И как эти названия в дальнейшем использовать, чтобы считывать из нужного файла информацию.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
03.11.2012, 19:04     Подать несколько файлов на вход программе #4
Угу, ну вот тебе, второй раз за день подобная просьба:
Извлечение имени файла

Так, имена файлов найдешь, в вектор строк складывать их надо так:
C++
1
2
3
vector<string>v;
//Тут код разный
v.push_back (string (FindFileData.cFileName));
Вектор v должен быть виден из обеих функций, поэтому сделай его глобальным.
А потом ты уж разберись как-нибудь с открытием файла по имени (каждый элемент v суть имя очередного файла). А как его обрабатывать, ты, как я понял, представляешь себе.
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
03.11.2012, 19:29  [ТС]     Подать несколько файлов на вход программе #5
Цитата Сообщение от kravam Посмотреть сообщение
Угу, ну вот тебе, второй раз за день подобная просьба:
Извлечение имени файла
Всё посмотрел впилил код НО:
Ругается на строчку
C++
1
        hf = FindFirstFile(ima_direktorii_i_rashirenie,&FindFileData);
error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'


#include-ы все приписал. Папку указал не пустую. Формат нужный указал. Два слэша не забыл. Не пойму что не так.

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 <windows.h>
#include <stdio.h>
 
int f (char* ima_direktorii_i_rashirenie){
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
        hf = FindFirstFile(ima_direktorii_i_rashirenie,&FindFileData);
        if(hf != INVALID_HANDLE_VALUE){
                do{
                        printf("%s\n",FindFileData.cFileName);
                 // Тут FindFileData.cFileName имя твоего очередного найденного 
                 // файла, чё хочешь с ним то и делай.
                }
                while(FindNextFile(hf,&FindFileData) != 0);
                FindClose(hf);
        }
        getchar();
        return 0;
}
 
 
void main(void)
{
    //Сюда напиши имя нужной директории и нужное расширение
    f ((char*)"C:\\Temp\\*.txt");
    getchar();
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
03.11.2012, 19:38     Подать несколько файлов на вход программе #6

Не по теме:

Странно всё это... По силам ли задачу берёшь, человече?


++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Цитата Сообщение от Omnio Посмотреть сообщение
error C2664: 'FindFirstFileW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'
Написано что невозможно ковертировать первый параметр из типа char* (который по факту) в тип LPCWSTR (который, ОЧЕВИДНО, должен быть). И всё бы ничего, но я не писал FindFirstFileW, я писал FindFirstFile, очевидно компилятор считает, что должен использоваться вариант функции, принимающей юникод-строку. Явно укажем ему обратное. Пробуй так:

C++
1
hf = FindFirstFileA(ima_direktorii_i_rashirenie,&FindFileData);
Используешь MSVS?
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
03.11.2012, 19:48  [ТС]     Подать несколько файлов на вход программе #7
Цитата Сообщение от kravam Посмотреть сообщение
Пробуй так:

C++
1
hf = FindFirstFileA(ima_direktorii_i_rashirenie,&FindFileData);
Используешь MSVS?
Использую MSVS 2008

Пробую по разному запустить, пока выдаётся следующая ошибка:
error C2664: 'FindFirstFileA' : cannot convert parameter 2 from 'WIN32_FIND_DATA *' to 'LPWIN32_FIND_DATAA'

Насчёт задачи. Сам не ожидал, что так мало знаю про работу с файлами. Может за одно посоветуете что почитать стоит ?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
03.11.2012, 20:50     Подать несколько файлов на вход программе #8
Можешь так попробовать:

C++
1
hf = FindFirstFileA(ima_direktorii_i_rashirenie, (LPWIN32_FIND_DATA)&FindFileData);
О результатах отпишись
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
03.11.2012, 21:12  [ТС]     Подать несколько файлов на вход программе #9
error C2664: 'FindFirstFileA' : cannot convert parameter 2 from 'LPWIN32_FIND_DATA' to 'LPWIN32_FIND_DATAA'
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
03.11.2012, 22:04     Подать несколько файлов на вход программе #10
А, прошу прощения так надо:
C++
1
hf = FindFirstFile(ima_direktorii_i_rashirenie,(LPWIN32_FIND_DATAA)&FindFileData);
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 41
04.11.2012, 14:03  [ТС]     Подать несколько файлов на вход программе #11
Спасибо огромное. Всё получилось.

Итак окончательное решение для моего случая:

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
#include <windows.h>
#include <stdio.h>
 
int f (char* ima_direktorii_i_rashirenie){
        WIN32_FIND_DATA FindFileData;
        HANDLE hf;
    
        hf = FindFirstFileA(ima_direktorii_i_rashirenie,(LPWIN32_FIND_DATAA)&FindFileData);
        if(hf != INVALID_HANDLE_VALUE){
                do{
                        printf("%s\n",FindFileData.cFileName);
                 // Тут FindFileData.cFileName имя твоего очередного найденного 
                 // файла, чё хочешь с ним то и делай.
                }
                while(FindNextFile(hf,&FindFileData) != 0);
                FindClose(hf);
        }
        getchar();
        return 0;
}
 
 
void main(void)
{
    //Сюда напиши имя нужной директории и нужное расширение
    f ((char*)"C:\\Temp\\*.txt");
    getchar();
}
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
04.11.2012, 15:46     Подать несколько файлов на вход программе #12
ОК, теперь на счёт того, что почитать.
Собсно, применительно к этому случаю тут мало что можно посоветовать. Дело в том, что мы споткнулись о СВОЕВОЛИЕ IDE, которые кроят под себя прототипы API-функций (да и не только), как им заблагорассудится. И исправить это положение вещей мы не можем. Это только с опытом приходит, как обойти то или иное препятствие.

По-хорошему всё должно быть ОЧЕНЬ просто и получаться безо всякого опыта. Решил, допустим, использовать FindFirstFile, заглянул в справочник,
http://msdn.microsoft.com/ru-ru/libr...=vs.85%29.aspx

(на худой конец)
http://vsokovikov.narod.ru/New_MSDN_...dfirstfile.htm

прочёл и используешь в соответствии с правилами. Ан нет. Каждая API норовит под себя кроить прототипы функций. Поэтому я ищу их в хидерах (для начала пойдёт консольная команда FIND) и в соответствии с найденными прототипами вызываю функции

+++++++++++++++++++++++++++++++++++++++++++++++++++++

Кроме того, надо знать, что некоторые функции существуют в двух вариантах, A и W. W это принимает юникодовские параметры, A- неюникодовские. (Это я смутно понимаю, ибо с юникодом не работаю). Я так понял, компилятор вместо FindFirstFile подставляет FindFirstFileA или FindFirstFileW и требует от нас соответствующих параметров
Почему именно компилятор подставил FindFirstFileW, а не FindFirstFileA, я не знаю. Может, где-то в настройках порыться надо. Как бы то ни было пришлось явно указывать букву A. Я работаю с g++, там попроще будет.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
04.11.2012, 16:02     Подать несколько файлов на вход программе #13
Цитата Сообщение от kravam Посмотреть сообщение
Дело в том, что мы споткнулись о СВОЕВОЛИЕ IDE
Это не своеволие IDE, это просто настройка проекта, надо установить опцию набор символов "Использовать многобайтовую кодировку"

Добавлено через 3 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Я работаю с g++, там попроще будет.
Может продемонстрируете насколько проще?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 18:27     Подать несколько файлов на вход программе
Еще ссылки по теме:

Разделить программу на несколько файлов C++
C++ Несколько cpp файлов в проекте
C++ Разделение кода на несколько файлов

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
04.11.2012, 18:27     Подать несколько файлов на вход программе #14
Цитата Сообщение от defer Посмотреть сообщение
Может продемонстрируете насколько проще
естессно

Итак, ищу прототип функции, чтобы её правильно вызвать. В g++ как вы думаете, где я его найду? Правильно, в файле winbase.h

А в MSVS? В файле atltransactionmanager.h
Здесь, кстати, о нём упоминания нет

Вот и всё, собсно. Гляжу я на "atltransactionmanager.h" и сомневаюсь- всё ли я правильно делаю?

И да, опережая ответ. Как сделать, я знаю. Я сомневаюсь, что, в MSVS это сделать проще... Извините.
Yandex
Объявления
04.11.2012, 18:27     Подать несколько файлов на вход программе
Ответ Создать тему
Опции темы

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