C выполняет один и тот же код для всех файлов в папке

#c #boost #directory

#c #boost #каталог

Вопрос:

Я действительно долгое время бродил по сети, и я даже не приблизился к какому-либо решению этой проблемы. Извините, если экспертам это кажется тривиальным.

У меня есть код на C , который принимает двоичный файл в качестве входного аргумента, выполняет некоторые вычисления, а затем выводит .csv файл. Итак, я использовал командную строку для выполнения кода над одним или несколькими файлами следующим образом

 MyProgram filename1 filename2 
  

В моем случае все мои файлы от filename1 до filenameN находятся в определенной папке.
Я хочу знать, есть ли какой-либо способ ввести имя папки, чтобы программа выполнялась для всех включенных файлов.

Может быть, что-то вроде этого

 Myprogram /Users/Whatever
  

или в Windows, как

 Myprogram C:UserWhatever
  

Заранее спасибо

Комментарии:

1. Рассматривалось использование цикла в коде?

2. Используйте Boost. Файловая система для перебора по заданному каталогу. C 17 будет иметь файловую систему как часть std

3. @CinCout Я не имею представления о том, как использование цикла внутри кода поможет прочитать неизвестное количество файлов в папке. Не могли бы вы дать мне какие-либо идеи для этого, пожалуйста?

4. @WhiZTiM Я попытался установить boost и настроить его. Но я закончил с действительно более сложными проблемами. Например, не находит файл или даже что-то вроде (неопределенные символы для архитектуры x86_64). Теперь я еще больше потерян!

Ответ №1:

Для Linux вы можете использовать командную строку с аргументами типа «дикие символы», такими как: YourProgram path/to/*.csv и вы получите все файлы, соответствующие шаблону path/to/*.csv , в массив argv.

Если это Windows, вы можете использовать некоторые Win API, такие как FindFirstFile, FindNextFile, чтобы разрешить подстановочные символы и получить все файлы соответствия. вы также можете проверить этот пример:

Комментарии:

1. Спасибо за ваш ответ.

2. Спасибо за ваш ответ. Однако, как я упоминал в своем вопросе, все мои файлы являются двоичными файлами, поэтому они не имеют никакого расширения. Когда я пытаюсь использовать подстановочные знаки для Linux, он считывает только первый файл.

3. В Linux вы получите 1-й аргумент в argv[1] 2-м в argv[2] и так далее. вам нужно будет выполнить цикл для всех аргументов for (i=1; i<argc; i ) .

Ответ №2:

На консолях на базе * nix команда «xargs» — ваш друг. например

find ./MyDirectory -name "*.notcsv" | xargs myprogram

Лично я бы не стал изменять сам код для перебора файлов, поскольку операционная система предоставляет механизм. Это делает вашу программу более «единой ответственностью». Если вы отправляете выходные данные в стандартный вывод / cout, это позволяет при необходимости связать вашу программу с другими командами обработки текста.

Приветствия