C - 读取多个文件

时间:2010-02-26 20:41:22

标签: c linux file

刚才有一个关于如何解决我面临的某个问题的一般性问题。我对C很新,所以请耐心等待。假设我有一个包含1000多个文本文件的文件夹,这些文件没有以任何编号顺序命名,但它们是按字母顺序排列的。对于我的问题,我有库存数据文件,每个文件都以公司各自的股票代码命名。我想写一个程序打开每个文件,读取数据找到历史低点并将其与当前价格进行比较并计算百分比变化,然后打印出来。搜索和计算不是问题,问题是让程序通过并打开每个文件。我可以看到攻击这个的唯一方法是创建一个包含所有股票代码的文本文件,让程序将其读入数组,然后运行一个循环,首先打开数组中的第一个文件名,执行计算,打印输出,关闭文件,然后循环回到数组中的第二个元素(下一个自动收录器符号)。设置起来相当简单(我认为),但我真的想避免在文本文件中输入超过一千个文件名。有没有更好的方法来解决这个问题?不是真的要求代码(除非在c中有一些令人惊奇的功能可以为我做这个;)),只是来自更有经验的C程序员的一些建议。

谢谢:)

编辑:这是在Linux上,抱歉我忘记了这一点!

9 个答案:

答案 0 :(得分:4)

在Linux / Unix(BSD,OS X,POSIX等)下,您可以使用opendir / readdir来浏览目录结构。当文件系统具有您想要的信息时,无需生成需要更新的静态文件。如果您只想在给定时间使用一组子股票,那么使用glob会更快,还有scandir

如果您使用Visual C ++作为C编译器进行开发,我不知道调用了什么Win32(Windows / Platform SDK)函数。搜索MSDN Library应该会对您有所帮助。

答案 1 :(得分:2)

假设你在Linux上运行......

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

正是你想要的。

答案 2 :(得分:2)

答案 3 :(得分:1)

标准C中没有任何具有“目录”概念的功能。您需要使用某种特定于平台的功能来执行此操作。有关示例,请查看this post from Cprogrammnig.com

就个人而言,我更喜欢使用opendir() / readdir()方法,如第二个示例所示。如果您使用的是Cygwin,它可以在Linux下本地运行,也可以在Windows上运行。

答案 4 :(得分:0)

方法1)我只有一个特定的目录,我只有这些文件包含自动收报机数据,没有别的。然后,我将使用C readdir API列出目录中的所有文件,并迭代执行所需数据处理的每个文件。文件适用的哪个股票代码仅由文件名确定。

优点:易于编码

缺点:这实际上取决于文件的存储位置和来源。

方法2)更改文件格式,以便自动收报机文件以识别这是自动收报机文件的魔术代码和包含该名称的字符串开头。和之前一样,使用readdir迭代文件夹中的所有文件并打开每个文件,确保设置了幻数并从文件中读取了自动收报机名称,并像以前一样处理数据

优点:比以前更灵活。文件名不需要反映自动收报机的名称   缺点:难以编码,文件格式可能会修复。

答案 5 :(得分:0)

  

但我真的想避免在文本文件中输入超过一千个文件名。有没有更好的方法来解决这个问题?

我已经解决了同样的问题,尽管是出于个人用途:)

我所做的是使用OS shell命令生成这些文件的列表,并将输出重定向到文本文件并让我的程序运行它们。

答案 6 :(得分:0)

在伪代码中,它看起来像这样,我无法定义代码,因为我不能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...

如果您愿意,可以稍微改变它,扫描目录条目中的文件名并首先通过首先构建带有文件名的记录对它们进行排序,然后返回列表/数组的开头并单独打开每个文件来读取然后将数据写入记录......

希望这有帮助, 最好的祝福, 汤姆。

答案 7 :(得分:0)

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

答案 8 :(得分:0)

在Linux或相关系统上,您可以使用fts库。它专为遍历文件层次结构而设计:man fts

甚至像readdir

那样简单

如果在Windows上,您可以使用他们的Directory Management API。更具体地说,FindFirstFile函数与通配符一起使用,与FindNextFile

结合使用