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

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

Войти
Регистрация
Восстановить пароль
 
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
#1

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

03.11.2012, 13:13. Просмотров 1009. Ответов 13
Метки нет (Все метки)

Работаю в Студии, в Винде.
В случае, когда мы считываем из одного (текстового) файла информацию (текст типа string (построчно) или char (посимвольно)), и далее обрабатываем её в нашей программе всё понятно.
НО, что если обработать подобным образом нужно более одного файла, лежащих в одной директории (если кто напишет ещё что-нибудь про случай с разными директориями буду рад вдвойне) ....

ВОПРОС: Как подать программе на вход в цикле каждый файл для последующей обработки каждого файла соответственно?
Обрабатываются txt файлы, причём имеются 3 директории:
В первой файлы, названия которых идут от 001.txt до 100.txt
Во второй файлы, названия которых идут от aa.txt, ab.txt, ac.txt и т.д. до zx.txt, zy.txt, zz.txt
В третей файлы, в названиях которых содержатся 5 символов (случайно взятые латинские буквы и цифры в привольном порядке) произвольная_комбинация.txt
В каждой директории содержится минимум 100 файлов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2012, 13:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Подать несколько файлов на вход программе (C++):

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

Несколько алгоритмов сортировки в одной программе - C++
Здравствуйте, форумчане. Подскажите пожалуйста, у меня есть 5 кодов программ. Суть в том, что каждая из них сортирует динамический...

Как считать текст из файла несколько раз подряд в программе? - C++
В общем, делал упражнение и у меня программа коряво написана так, что получается нужно использовать текст файла несколько раз, но я не знаю...

Шаблоны, разделение на несколько файлов - C++
Добрый вечер! Написал обобщенный класс. Все работает, все ок. Да, вот только мне не нравится, что реализация методов идет в...

Разделение mp4 на несколько файлов - C++
Есть mp4 файл в кодеке h264, сформированный по трем разным каналам. Нужно по имеющемуся файлу сформировать три, соответственно каждому...

Открыть несколько разных файлов - C++
Добрый вечер. Не могу разобраться с проблемой. Нужно открыть несколько файлов text, где i цифра от 1 до n (text1, text2, text3 и т.д.)....

13
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
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, то есть выход из цикла.
0
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
03.11.2012, 18:54  [ТС] #3
Цитата Сообщение от kravam Посмотреть сообщение
1) Нашёл бы имена всех НУЖНЫХ файлов в этой директории. Поместил бы их в вектор строк, например
vector <string> imena;
Мне нужен не алгоритм действий. А чтобы вы показали на каких-нибудь небольших примерах как производится поиск имён файлов в директории в принципе. И как их названия можно помещать в вектор строк. И как эти названия в дальнейшем использовать, чтобы считывать из нужного файла информацию.
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
03.11.2012, 19:04 #4
Угу, ну вот тебе, второй раз за день подобная просьба:
Извлечение имени файла

Так, имена файлов найдешь, в вектор строк складывать их надо так:
C++
1
2
3
vector<string>v;
//Тут код разный
v.push_back (string (FindFileData.cFileName));
Вектор v должен быть виден из обеих функций, поэтому сделай его глобальным.
А потом ты уж разберись как-нибудь с открытием файла по имени (каждый элемент v суть имя очередного файла). А как его обрабатывать, ты, как я понял, представляешь себе.
0
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
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();
}
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
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?
0
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
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'

Насчёт задачи. Сам не ожидал, что так мало знаю про работу с файлами. Может за одно посоветуете что почитать стоит ?
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
03.11.2012, 20:50 #8
Можешь так попробовать:

C++
1
hf = FindFirstFileA(ima_direktorii_i_rashirenie, (LPWIN32_FIND_DATA)&FindFileData);
О результатах отпишись
0
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
03.11.2012, 21:12  [ТС] #9
error C2664: 'FindFirstFileA' : cannot convert parameter 2 from 'LPWIN32_FIND_DATA' to 'LPWIN32_FIND_DATAA'
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
03.11.2012, 22:04 #10
А, прошу прощения так надо:
C++
1
hf = FindFirstFile(ima_direktorii_i_rashirenie,(LPWIN32_FIND_DATAA)&FindFileData);
1
Omnio
0 / 0 / 0
Регистрация: 19.07.2009
Сообщений: 46
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();
}
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
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++, там попроще будет.
0
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
04.11.2012, 16:02 #13
Цитата Сообщение от kravam Посмотреть сообщение
Дело в том, что мы споткнулись о СВОЕВОЛИЕ IDE
Это не своеволие IDE, это просто настройка проекта, надо установить опцию набор символов "Использовать многобайтовую кодировку"

Добавлено через 3 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Я работаю с g++, там попроще будет.
Может продемонстрируете насколько проще?
0
kravam
быдлокодер
1702 / 889 / 45
Регистрация: 04.06.2008
Сообщений: 5,499
04.11.2012, 18:27 #14
Цитата Сообщение от defer Посмотреть сообщение
Может продемонстрируете насколько проще
естессно

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

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

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

И да, опережая ответ. Как сделать, я знаю. Я сомневаюсь, что, в MSVS это сделать проще... Извините.
0
04.11.2012, 18:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2012, 18:27
Привет! Вот еще темы с ответами:

Несколько cpp файлов в проекте - C++
Доброго времени суток ! Есть проект и в нем 2 cpp файла: Main.cpp и BinaryNumber.cpp В последнем файле создан класс и его методы....

Разделение кода на несколько файлов - C++
• Имеем основной cpp файл с main. • Имеем код некоторых нужных функций • Есть указание реализовать эти функции не в основном cpp, а в...

Непонятная ошибка. Несколько файлов - C++
один header подключаем в другой(у которого есть .cpp файл) и возникает ошибка! play1.h struct card { int...

Разделение кода на несколько файлов - C++
Доброго времени суток. Заинтересовал вопрос о разделении кода, когда это требуется разделяю на один CPP файл и некоторое количество H...


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

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

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