【问题标题】:C - Reading multiple filesC - 读取多个文件
【发布时间】:2010-02-26 20:41:22
【问题描述】:

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

谢谢:)

编辑:这是在 Linux 上的,抱歉我忘了说!

【问题讨论】:

  • Windows linux ?这取决于系统。
  • 如果您使用的是 c++,您可以使用 boost Filesystem 库在给定目录路径的情况下遍历目录的每个项目。
  • +1 下次请正确格式化您的问题:)。它更容易理解。
  • 对不起,这是在 Linux 上完成的

标签: c linux file


【解决方案1】:

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

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

【讨论】:

  • 在 Win32 API 中,FindFirstFile(或FindFirstFileEx)/FindNextFile/FindClose
【解决方案2】:

假设你在 linux 上运行...

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

正是你想要的。

【讨论】:

  • 在 Windows 上:dir /b > names.txt
【解决方案3】:

【讨论】:

    【解决方案4】:

    在伪代码中它看起来像这样,我无法定义代码,因为我不能 100% 确定这是否是正确的方法......

    对于每个目录条目 扫描文件名 从文件名中提取代码名称 打开文件 读取数据 创建一个由文件名、数据组成的记录...... 关闭文件 将记录添加到列表/数组... > 根据字母顺序对列表/数组进行排序 文件名中的股票名称...

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        优点:易于编码

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

        方法 2) 更改文件格式,使代码文件以标识这是代码文件的魔术代码和包含名称的字符串开头。和以前一样使用 readdir 遍历文件夹中的所有文件并打开每个文件,确保设置了幻数并从文件中读取股票名称,并像以前一样处理数据

        优点:比以前更灵活。文件名不必反映股票代码的名称 缺点:难以编码,文件格式可能是固定的。

        【讨论】:

        • readdir 不是 C API,而是 POSIX API。 Microsoft 的 CRT for Windows 没有这些功能。
        【解决方案7】:

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

        不久前我已经解决了完全相同的问题,尽管是为了个人用途:)

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

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

            甚至像readdir这样简单的东西

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-22
              • 2023-04-03
              • 1970-01-01
              • 2019-08-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多