gpt4 book ai didi

c++ - 正确,有效地读取文件

转载 作者:搜寻专家 更新时间:2023-10-30 23:59:28 28 4
gpt4 key购买 nike

我想一次读取并处理CSV文件第一行中的条目(例如打印)。我假设使用Unix风格的\n换行符,没有条目长度超过255个字符,并且(现在)在EOF之前有一个换行符。这意味着它是fgets()后跟strtok()的更有效的替代方法。

#include <stdio.h>
#include <string.h>

int main() {
int i;
char ch, buf[256];
FILE *fp = fopen("test.csv", "r");

for (;;) {
for (i = 0; ; i++) {
ch = fgetc(fp);
if (ch == ',') {
buf[i] = '\0';
puts(buf);
break;
} else if (ch == '\n') {
buf[i] = '\0';
puts(buf);
fclose(fp);
return 0;
} else buf[i] = ch;
}
}
}
  • 此方法是否尽可能有效和正确?
  • 使用此方法测试EOF和文件读取错误的最佳方法是什么? (可能性:针对字符宏EOFfeof()ferror()等进行测试)。
  • 是否可以在不损失效率的情况下使用C++文件I / O 执行相同的任务?
  • 最佳答案

    最有效的方法将在很大程度上取决于操作系统,标准库(例如libc),甚至是您所运行的硬件。这样几乎不可能告诉您什么是“最有效的”。

    话虽如此,您可以尝试以下几种方法:

  • 使用 mmap() 或等效的本地操作系统(Windows具有CreateFileMapping / OpenFileMapping / MapViewOfFile,可能还有其他操作系统)。然后,您无需进行显式的文件读取:您只需访问文件就好像文件已在内存中一样,任何不存在的内容都将由页面错误机制进行错误处理。
  • 手动将整个文件读入缓冲区,然后在该缓冲区上工作。调用文件读取函数的次数越少,调用函数的开销就越少,并且应用程序/ OS域切换也可能会更少。显然,这会占用更多的内存,但很值得。
  • 针对您的问题和平台使用更理想的字符串扫描程序。自己逐个字符地进行操作几乎从来没有像依赖于您的问题 Realm 中现有的方法那样快。例如,您可以打赌strchrmemchr可能比大多数您可以滚动的代码更好地进行了优化,可以完成诸如一次读取整个缓存行或单词,使用更好的算法进行此类搜索进行扫描等操作。对于更复杂的情况,您可以考虑使用一个完整的正则表达式引擎,该引擎可以将您的正则表达式快速编译为适合复杂情况的文件。
  • 避免在周围复制字符串。考虑“查找定界符”然后思考“定界符之间的输出”可能会有所帮助。例如,您可以使用strchr查找下一个感兴趣的字符,然后使用fwrite或直接从输入缓冲区写入stdout的内容。然后,您将大部分工作保留在几个本地寄存器中,而不是使用堆栈或堆buf

  • 但是,如果有疑问,请尝试一些可能性和配置文件,配置文件,配置文件。

    同样对于此类问题,请务必注意由操作系统和硬件缓存引起的运行之间的差异:对一堆运行进行概要分析,而不是每次更改后仅运行一次-如果可能,请使用可能总是命中缓存的测试(如果您要衡量最佳情况下的性能)或可能会错过的测试(如果您要衡量最坏情况下的性能)。

    关于C++文件IO( fstream等),请注意它们是更大,更复杂的野兽。它们倾向于包括诸如语言环境管理,自动缓冲等之类的东西,并且不太容易出现特定类型的编码错误。

    如果您正在做一些非常简单的事情(例如您在此处描述的内容),那么我倾向于发现C++库的内容会妨碍您的工作。 (有时使用调试器和“逐步指令”通过stringstream方法,而不是使用某些C字符串函数,您很快就会对此有所了解。)

    这完全取决于您将来是否需要其他功能或安全性。

    最后,强制性的是“不要汗流小东西”。如果真的很重要,请只花时间在这里进行优化。否则,请相信库和OS在大多数情况下都能为您做正确的事情-如果您对微优化的了解太深,您会发现自己稍后会陷入困境。这并不是要让您从“我是否应该提前读取整个文件,这会破坏将来的用例”这一思想上阻止您,因为这是宏而不是微观的。

    但是总的来说,如果您出于充分的理由不进行这种“使其更快”的调查,即“我编写此代码后,需要该应用程序表现更好,并且此代码在分析器中显示为缓慢”。 ,或“这样做很有趣,以便我能更好地理解系统”-好吧,先把时间花在其他地方。 =)

    关于c++ - 正确,有效地读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16378468/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com