Вопрос

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

Спасибо :)

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

В псевдокоде это будет выглядеть так: я не могу определить код, так как не уверен на 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...

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

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

В UNIX есть удобный шарик функция:

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);

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

или даже что-то простое, например каталог чтения

Если вы используете Windows, вы можете использовать их Управление каталогом API.Более конкретно, НайтиFirstFile функция, используемая с подстановочными знаками в сочетании с НайтиСледующийФайл

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top