如何知道fscanf在文件中到达了新行\ n。 我一直在使用自己的功能来做到这一点。我知道我可以使用fgets然后使用sscanf来获取我所需的模式。但是我的要求不稳定,有时候我想得到TAB分隔的字符串,有时候是新行分隔的字符串,有时候是一些特殊的字符分隔字符串。所以,如果有任何方法可以从fscanf了解新行,请帮助我。或者也欢迎任何其他方式。
提前谢谢。
答案 0 :(得分:2)
fscanf(stream, "%42[^\n]", buffer);
是fgets(缓冲区,42,流)的等价物。你不能用42替换*来指定参数中的缓冲区长度(正如你在printf中所做的那样),它的意思是抑制赋值。所以
fscanf(stream, "%*[^\n]%*c");
读取(并包含)下一行符号字符。
除[,c和n之外的任何转换说明符都以跳过空格开头。
答案 1 :(得分:1)
Kernighan和Pike在优秀书籍“The Practice of Programming”中展示了如何使用sprintf()
创建一个合适的格式说明符,包括长度(类似于AProgrammer答案中的例子),然后使用在scanf()
的电话中。这样,您还可以控制分隔符。对这种方法“效率低下”的担忧可能是错误的 - 替代方案难以做到正确。
那就是说,我通常不会将scanf()
系列函数用于文件I / O;我将数据转换为带有某种“get line”例程的字符串,然后使用sscanf()
系列函数将其拆分 - 或者使用其他更专业的解析代码。