在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);
。 不要那样做。
如果您不知道文件大小,则有两种选择。
-
在C库中的某处定义了一个
LINE_MAX
宏(AFAIK只有POSIX,但有些实现可能有等价物)。 线条不超过该长度是公平的假设。 -
您可以使用“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
来结束一行。