【发布时间】:2013-05-04 20:07:09
【问题描述】:
我想一次读取和处理(例如打印)来自 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 和文件读取错误的最佳方法是什么? (可能性:针对字符宏
EOF、feof()、ferror()等进行测试)。 - 我能否使用 C++ 文件 I/O 执行相同的任务不会降低效率?
【问题讨论】:
-
我不知道 CSV 文件可以在引号内包含非定界逗号。然而,这是一个普遍的问题,我可以很容易地考虑到任何具体的实现。
-
没那么容易。如果你支持引用的值,你必须支持正确的转义,所以
"foo\"bar"被识别为foo"bar -
您追求的是效率的抽象概念,还是您实际上已针对效率较低的方法对该方法进行了计时?如果你做了一些计时,结果如何?
-
@EdS。 C++参考问题3。