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

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

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

有没有人有更好的解决方案或有人解释上述工作原理?(我还没有测试过)

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

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

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

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

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

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

  2. 您可以使用“read和realloc”方式,但不必为每个字符重新分配realloc() 。 该问题的传统解决方案是指数地扩展缓冲区大小,即在耗尽时总是将分配的内存加倍。

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

 %specifier 

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

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

[^characters]Negated scanset任意数量的字符,它们都没有指定为括号之间的字符。


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

读取任何字符,直到Negated scanset中的任何字符出现,在本例中为newline character


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

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