1

我正在尝试几个小时来找到我在大学时遇到的这个问题的答案。我试着用两行写一个文件来运行这个:hello world,它完美地读取了文件,所以我找不到答案。我会很感激你的帮助!

一个学生编写了下一个函数,用于读取文本文件并按原样打印。

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

这个函数的两个错误是什么?

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

谢谢。

4

3 回答 3

1

主要错误是fsacnf( fIn, "%s", nextLine )没有扫描完整的行。从手册页

s 匹配一系列非空白字符;下一个指针必须是一个指向字符数组的指针,它的长度足以容纳输入序列和自动添加的终止空字节 ('\0')。输入字符串在空白处或最大字段宽度处停止,以先发生者为准。

因此,如果您有一行“a b”,第一个fscanf()将仅扫描“a”,第二个将扫描“b”,并且两者都打印在两个不同的行中。您可以使用fgets()读取整行。

第二个可能是它声明“文件中的每一行不超过 MAX_LINE_LENGTH 个字符”,但nextLine最多可以包含MAX_LINE_LENGTH-1字符 (+ '\0')。fscanf()如果您替换为,则该问题变得更加重要,fgets()因为nextLine它还必须具有存储容量'\n''\r\n'(取决于您所在的平台)

于 2013-07-29T16:25:41.447 回答
1
  1. 它丢弃空白。尝试添加多个空格和制表符。

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

  3. 通过 scanf 读取字符串是危险的。没有边界检查。您可能会读到 MAX_LINE_LENGTH。(并且繁荣!Segfault)

于 2013-07-29T16:25:22.620 回答
1

这样做的正确方法是:

void ReadFile(FILE *fIn)
{
  char nextLine[MAX_LINE_LENGTH];
  while(fgets(nextLine, MAX_LINE_LENGTH, fIn)) {
      printf("%s", nextLine);
  }
}

正如有些人发布的那样,使用 feof 来控制循环不是一个好主意,也不是使用 fscanf 来读取行。

于 2013-07-29T16:46:23.143 回答