С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 1
Регистрация: 19.07.2009
Сообщений: 54

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

03.11.2012, 13:13. Показов 3171. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2012, 13:13
Ответы с готовыми решениями:

Несколько файлов на вход программе
К примеру, в OpenFileDialog пользователь может зажав Ctrl выбрать несколько текстовых файлов и нажать "Открыть", и далее...

Что нужно подать на вход АЦП?
Доброго времени суток! Имеется у АЦП дифференциальный вход, подаю на вход дифференциальное напряжение, диапазон В на каждом из входов...

Вывод двух команд подать на вход третьей
Добрый день! Подскажите, пожалуйста. мне нужно, чтобы вывод двух команд подавался на вход perl'у, а то получается, подается на...

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

Так, имена файлов найдешь, в вектор строк складывать их надо так:
C++
1
2
3
vector<string>v;
//Тут код разный
v.push_back (string (FindFileData.cFileName));
Вектор v должен быть виден из обеих функций, поэтому сделай его глобальным.
А потом ты уж разберись как-нибудь с открытием файла по имени (каждый элемент v суть имя очередного файла). А как его обрабатывать, ты, как я понял, представляешь себе.
0
1 / 1 / 1
Регистрация: 19.07.2009
Сообщений: 54
03.11.2012, 19:29  [ТС]
Цитата Сообщение от 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
03.11.2012, 19:38

Не по теме:

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


++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++
Цитата Сообщение от 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
1 / 1 / 1
Регистрация: 19.07.2009
Сообщений: 54
03.11.2012, 19:48  [ТС]
Цитата Сообщение от 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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
03.11.2012, 20:50
Можешь так попробовать:

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

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

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
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
04.11.2012, 15:46
ОК, теперь на счёт того, что почитать.
Собсно, применительно к этому случаю тут мало что можно посоветовать. Дело в том, что мы споткнулись о СВОЕВОЛИЕ IDE, которые кроят под себя прототипы API-функций (да и не только), как им заблагорассудится. И исправить это положение вещей мы не можем. Это только с опытом приходит, как обойти то или иное препятствие.

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

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

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

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

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

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

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

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

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

И да, опережая ответ. Как сделать, я знаю. Я сомневаюсь, что, в MSVS это сделать проще... Извините.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.11.2012, 18:27
Помогаю со студенческими работами здесь

Помогите ! Как подать логический 0 и 1 на вход схемы ?!
На логическую микросхему надо одним выключателем подавать лог 1, если включить выключатель - это просто, НО как подать отрицательное...

Можно ли с выхода компа подать на вход ноута
Не знаю в какой ветке задать вопрос, но есть комп в сети, на нём инет, в котором есть учебное видео, но нет динамиков, зато есть выход на...

Embedded Matlab Editor: подать выход на вход
Здравствуйте! У меня есть блок &quot;Embedded Matlab function&quot; , в который на вход подается некая переменная. После выполнения этого блока...

Подать напряжение на любой из интерфейсов (USB/вход наушников/микрофона и т.д.)
Не уверен , что обращаюсь куда нужно , не имею глубоких знаний в сфере програмирования на языке Асемблера. Но тем не менее стоит задача и...

Парсер Simple html dom на вход подать список с ссылками
Всем доброго времени суток. Пробуюю разобратся с этой библиотекой парсинга. В общем парсер слепил, проблема осталась только как с...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru