我正在努力寻找这个问题的答案。我尝试用两行编写一个文件来运行它: 你好 世界 它完美地读取文件,所以我找不到答案。我很感激你的帮助!
学生编写了下一个阅读文本文件并完全按原样打印的功能。
void ReadFile(FILE *fIn)
{
char nextLine[MAX_LINE_LENGTH];
while(!feof(fIn))
{
fscanf(fIn,"%s",nextLine);
printf("%s\n",nextLine);
}
}
此功能有两个错误?
您可以假设文件中的每一行不长于MAX_LINE_LENGTH个字符,并且它是一个仅包含字母字符的文本文件,并且每一行都以'\ n'结尾。
感谢。
答案 0 :(得分:1)
丢弃空白区域。尝试添加多个空格和标签。
它可能会多次评估一个流,如果出现读取错误,则循环永远不会终止。
请参阅:Why is “while ( !feof (file) )” always wrong?
通过scanf读取字符串很危险。没有界限检查。您可以阅读MAX_LINE_LENGTH。(和繁荣!Segfault)
答案 1 :(得分:1)
主要错误是fsacnf( fIn, "%s", nextLine )
没有扫描完整的一行。
来自man page:
<强>取值强> 匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节(&#39; \ 0&#39;),这是自动添加的。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。
因此,如果你有一条线&#34; a b&#34;第一个fscanf()
将仅扫描&#34; a&#34;第二个&#34; b&#34;两者都印在两条不同的线上。您可以使用fgets()
来读取整行。
第二个可能是它已声明&#34;文件中的每一行不长于MAX_LINE_LENGTH个字符&#34;但nextLine
可以包含最多MAX_LINE_LENGTH-1
个字符(+ '\0'
)。如果您将fscanf()
替换为fgets()
,则问题会变得更加重要,因为nextLine
还必须具有存储'\n'
或'\r\n'
的能力(具体取决于您所使用的平台) #39;重新开始)
答案 2 :(得分:1)
这样做的正确方法是:
void ReadFile(FILE *fIn)
{
char nextLine[MAX_LINE_LENGTH];
while(fgets(nextLine, MAX_LINE_LENGTH, fIn)) {
printf("%s", nextLine);
}
}
有些人发布使用feof来控制循环不是一个好主意,也不是使用fscanf读取行。