C错误中的I / O.

时间:2013-07-29 16:12:44

标签: c input output

我正在努力寻找这个问题的答案。我尝试用两行编写一个文件来运行它: 你好 世界 它完美地读取文件,所以我找不到答案。我很感激你的帮助!

学生编写了下一个阅读文本文件并完全按原样打印的功能。

void ReadFile(FILE *fIn)
{
  char nextLine[MAX_LINE_LENGTH];
  while(!feof(fIn))
 {
 fscanf(fIn,"%s",nextLine);
 printf("%s\n",nextLine);
 }
}

此功能有两个错误?

您可以假设文件中的每一行不长于MAX_LINE_LENGTH个字符,并且它是一个仅包含字母字符的文本文件,并且每一行都以'\ n'结尾。

感谢。

3 个答案:

答案 0 :(得分:1)

  1. 丢弃空白区域。尝试添加多个空格和标签。

  2. 它可能会多次评估一个流,如果出现读取错误,则循环永远不会终止。
    请参阅:Why is “while ( !feof (file) )” always wrong?

  3. 通过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读取行。