C - Чтение нескольких файлов - PullRequest
2 голосов
/ 26 февраля 2010

только что был общий вопрос о том, как подойти к определенной проблеме, с которой я сталкиваюсь. Я довольно новичок в C, так что терпите меня здесь. Скажем, у меня есть папка с 1000+ текстовыми файлами, файлы не имеют имен в любом порядке нумерации, но они в алфавитном порядке. Для моей проблемы у меня есть файлы данных о запасах, каждый файл назван в честь соответствующего тикера компании. Я хочу написать программу, которая откроет каждый файл, прочитает данные, найдет исторический минимум, сравнит его с текущей ценой и рассчитает процентное изменение, а затем распечатает его. Поиск и расчет не являются проблемой, проблема в том, чтобы программа прошла и открыла каждый файл. Единственный способ увидеть это - создать текстовый файл, содержащий все символы тикера, с помощью которого программа считывает это в массив, а затем запускает цикл, который сначала открывает первое имя файла в массиве, выполняет вычисления, печатает На выходе закройте файл, затем вернитесь назад, чтобы перейти ко второму элементу (следующему символу тикера) в массиве. Это было бы довольно просто настроить (я думаю), но я действительно хотел бы избежать ввода более тысячи имен файлов в текстовый файл. Есть ли лучший способ приблизиться к этому? На самом деле не нужно запрашивать код (если только в c нет замечательной функции, которая сделает это за меня;)), просто несколько советов от более опытных программистов на Си.

Спасибо:)

Редактировать: Это в Linux, извините, я забыл упомянуть!

Ответы [ 9 ]

4 голосов
/ 27 февраля 2010

В Linux / Unix (BSD, OS X, POSIX и т. Д.) Вы можете использовать opendir / readdir для просмотра структуры каталогов. Не нужно генерировать статические файлы, которые нужно обновлять, когда файловая система имеет необходимую информацию. Если вам нужен только поднабор акций в определенный момент времени, то использование glob будет быстрее, также есть scandir .

Я не знаю, как называются функции Win32 (Windows / Platform SDK), если вы разрабатываете с использованием Visual C ++ в качестве компилятора Си. Поиск MSDN Library должен помочь вам.

2 голосов
/ 26 февраля 2010
2 голосов
/ 26 февраля 2010

Предполагается, что вы работаете в Linux ...

ls /path/to/text/files > names.txt

именно то, что вы хотите.

1 голос
/ 27 февраля 2010

В стандартном C нет функций, которые бы имели какое-либо представление о «каталоге».Вам нужно будет использовать какую-то платформо-зависимую функцию для этого.Для некоторых примеров посмотрите на этот пост с Cprogrammnig.com .

Лично я предпочитаю использовать подход opendir() / readdir(), как показано во втором примере.Он изначально работает под Linux, а также под Windows, если вы используете Cygwin.

0 голосов
/ 27 февраля 2010

В Linux или связанной системе вы можете использовать библиотеку fts. Он предназначен для обхода файловых иерархий: man fts ,

или даже что-то простое, как readdir

Если в Windows вы можете использовать их Управление каталогами API. Более конкретно, функция FindFirstFile , используемая с подстановочными знаками, в сочетании с FindNextFile

0 голосов
/ 26 февраля 2010

В UNIX есть удобная функция glob :

glob_t results;
memset(&results, 0, sizeof(results));
glob("*.txt", 0, NULL, &results);
for (i = 0; i < results.gl_pathc; i++)
    printf("%s\n", results.gl_pathv[i]);
globfree(&results);
0 голосов
/ 26 февраля 2010

В псевдокоде это выглядело бы так: я не могу определить код, так как не уверен на 100%, правильный ли это подход ...

for each directory entry
    scan the filename
         extract the ticker name from the filename
         open the file
              read the data
              create a record consisting of the filename, data.....
         close the file
         add the record to a list/array...
> sort the list/array into alphabetical order based on 
  the ticker name in the filename...

Вы можете немного изменить его, если хотите, отсканировать имена файлов в записях каталога и сначала отсортировать их, создав сначала запись с именами файлов, а затем вернуться к началу списка / массива и открыть каждое из них по отдельности, читая данные и внесение их в запись затем ....

Надеюсь, это поможет, с уважением, Том.

0 голосов
/ 26 февраля 2010

но я бы действительно хотел избежать ввода более тысячи имен файлов в текстовый файл. Есть ли лучший способ приблизиться к этому?

Я решил ту же самую проблему некоторое время назад, хотя и для личного использования:)

Я использовал команды оболочки ОС для генерации списка этих файлов и перенаправил вывод в текстовый файл, после чего моя программа запустила их.

0 голосов
/ 26 февраля 2010

Подход 1) У меня просто есть конкретный каталог, в котором у меня есть ТОЛЬКО эти файлы, содержащие данные тикера и ничего больше. Затем я бы использовал C readdir API, чтобы вывести список всех файлов в каталоге и перебрать каждый из них, выполняя необходимую вам обработку данных. К какому тикеру относится файл, определяется только именем файла.

Плюсы: легко кодировать

Минусы: Это действительно зависит от того, где хранятся файлы и откуда они берутся.

Подход 2) Измените формат файла так, чтобы файлы тикера начинались с магического кода, идентифицирующего, что это файл тикера, и строки, содержащей имя. Как и прежде, используйте readdir для перебора всех файлов в папке и открытия каждого файла, убедитесь, что установлен магический номер, прочитайте имя тикера из файла и обработайте данные, как раньше

Плюсы: более гибкие, чем раньше. Имя файла не должно отражать имя тикера Минусы: сложнее кодировать, формат файла может быть исправлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...