【发布时间】:2014-07-10 09:21:15
【问题描述】:
我是新手,并且有一个 C - Linux 程序,它可以读取许多变量行,如下所示:
12 34 56 78
3 4 7 900
...
%d %d %d %d
...
1 2 3 4
目前我写的函数是这样的:
void Import(const char* path_of_file)
{
FILE *cfile = fopen(path_of_file, "r");
int lines = 0;
//I copied it from another question
while (EOF != (fscanf(cfile,"%*[^/n]"), fscanf(cfile, "%*c"))) ++lines;
fclose(cfile);
cfile = fopen(path_of_file, "w");
...
for( i=0; i<n; i++)
{
...
fscanf(cfile, "%d %d %d %d", &a, &b, &c, &d);
...
}
...
//Of course it will return something, but it shouldn't matter here
fclose(cfile);
}
但可能是因为文本文件是在 Windows 中创建的或其他什么,它并不总是以换行符结尾,所以我的程序经常错过最后一行。
如果文件不存在,是否有自动在文件末尾附加换行符?或者更好的是,有没有办法在没有换行符的情况下读取最后一行?基于上述的一个示例函数会非常好。
【问题讨论】:
-
如果您希望在 linux 系统上使用 Windows 格式的文件,您可能需要尝试使用命令行工具 dos2unix 来修复换行符
-
如果要读取行,请使用 fgets 而不是 scanf。如果您必须担心文件末尾有换行符或没有换行符,那么您可能做错了。
-
使用
fgets读取一行,使用sscanf解析它。更容易处理。 -
@user3288829 其实是赋值,所以工具没办法,必须在程序内运行。
-
计算行数的方式有点奇怪(为什么是
/n?)。但如果它在大多数情况下都有效,您可以通过迭代n+1次来高估这个数字,如果scanf无法读取任何内容,则退出循环。