我正在编写一个程序来输入文件中的多行。 问题是我不知道线的长度,所以我不能使用fgets因为我需要给出缓冲区的大小而不能使用fscanf因为它停在空格令牌 我看到了一个解决方案,他建议使用malloc和realloc作为输入的每个字符,但我认为有一个更简单的方法,然后我发现有人建议使用
fscanf(file,"%[^\n]",line);
有没有人有更好的解决方案或有人可以解释上述方法是如何工作的?(我还没有测试过)
我使用GCC编译器,如果需要的话
答案 0 :(得分:2)
您可以使用getline(3)。它代表您分配内存,当您阅读完行后,您应该释放内存。
答案 1 :(得分:1)
然后我发现有人建议使用
fscanf(file,"%[^\n]",line);
这实际上是fgets(line, sizeof line, file);
的不安全版本。别这么做。
如果您不知道文件大小,则有两种选择。
在C库的某处定义了一个LINE_MAX
宏(AFAIK它只有POSIX,但有些实现可能有等价物)。这是一个公平的假设,即线条不会超过这个长度。
你可以去"阅读和重新分享"方式,但你不必为每个角色realloc()
。该问题的传统解决方案是指数地扩展缓冲区大小,即。即当耗尽时,总是将分配的内存加倍。
答案 2 :(得分:1)
scanf或fscanf的简单格式说明符遵循此原型
%specifier
说明符
我们知道d
是整数的格式说明符,就像这样
[characters]
是Scanset
括号中指定的任意数量的字符。
在某些库实现中,不是第一个字符的破折号( - )可能会产生非可移植行为。
[^characters]
是
Negated scanset
任意数量的字符都没有在括号中指定为字符。
fscanf(file,"%[^\n]",line);
在这种情况下Negated scanset
newline character
答案 3 :(得分:0)
行fscanf(file,"%[^\n]",line);
表示它会将\n
以外的任何内容读入line
。我认为这应该适用于Linux和Windows。但可能无法在OS X格式中使用\r
来结束一行。