在C编程中扫描文件中的整行

时间:2013-10-16 17:37:43

标签: c eol

我正在编写一个程序来输入文件中的多行。 问题是我不知道线的长度,所以我不能使用fgets因为我需要给出缓冲区的大小而不能使用fscanf因为它停在空格令牌 我看到了一个解决方案,他建议使用malloc和realloc作为输入的每个字符,但我认为有一个更简单的方法,然后我发现有人建议使用

fscanf(file,"%[^\n]",line);

有没有人有更好的解决方案或有人可以解释上述方法是如何工作的?(我还没有测试过)

我使用GCC编译器,如果需要的话

4 个答案:

答案 0 :(得分:2)

您可以使用getline(3)。它代表您分配内存,当您阅读完行后,您应该释放内存。

答案 1 :(得分:1)

  

然后我发现有人建议使用fscanf(file,"%[^\n]",line);

这实际上是fgets(line, sizeof line, file);的不安全版本。别这么做。

如果您不知道文件大小,则有两种选择。

  1. 在C库的某处定义了一个LINE_MAX宏(AFAIK它只有POSIX,但有些实现可能有等价物)。这是一个公平的假设,即线条不会超过这个长度。

  2. 你可以去"阅读和重新分享"方式,但你不必为每个角色realloc()。该问题的传统解决方案是指数地扩展缓冲区大小,即。即当耗尽时,总是将分配的内存加倍。

答案 2 :(得分:1)

scanf或fscanf的简单格式说明符遵循此原型

%specifier 

说明符

我们知道d是整数的格式说明符,就像这样

[characters]Scanset括号中指定的任意数量的字符。  在某些库实现中,不是第一个字符的破折号( - )可能会产生非可移植行为。

[^characters]是     Negated scanset任意数量的字符都没有在括号中指定为字符。


fscanf(file,"%[^\n]",line);  

在这种情况下Negated scanset newline character

中读取任何字符,直到{{1}}中出现任何字符为止

正如其他人所建议您可以使用getline()fgets()并查看example

答案 3 :(得分:0)

fscanf(file,"%[^\n]",line);表示它会将\n以外的任何内容读入line。我认为这应该适用于Linux和Windows。但可能无法在OS X格式中使用\r来结束一行。