Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的I/O错误_C_Input_Output - Fatal编程技术网

C中的I/O错误

C中的I/O错误,c,input,output,C,Input,Output,我花了几个小时试图找到我在大学里遇到的这个问题的答案。我尝试通过编写一个包含以下两行内容的文件来运行此功能: 你好 世界 而且它能很好地读取文件,所以我找不到答案。谢谢你的帮助 一名学生编写了下一个函数,用于读取文本文件并按原样打印 void ReadFile(FILE *fIn) { char nextLine[MAX_LINE_LENGTH]; while(!feof(fIn)) { fscanf(fIn,"%s",nextLine); printf("%s\n",nextLi

我花了几个小时试图找到我在大学里遇到的这个问题的答案。我尝试通过编写一个包含以下两行内容的文件来运行此功能: 你好 世界 而且它能很好地读取文件,所以我找不到答案。谢谢你的帮助

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

void ReadFile(FILE *fIn)
{
  char nextLine[MAX_LINE_LENGTH];
  while(!feof(fIn))
 {
 fscanf(fIn,"%s",nextLine);
 printf("%s\n",nextLine);
 }
}
此函数中的两个错误是什么

您可以假定文件中的每一行长度不超过最大行长度字符,并且它是一个只包含字母字符的文本文件,并且每一行都以“\n”结尾

谢谢

  • 它丢弃空白。尝试添加多个空格和选项卡

  • 它可能会多次计算流,如果出现读取错误,循环将永远不会终止。
    见:

  • 通过scanf读取字符串是危险的。没有边界检查。您可以读取超过您的最大线长度。(和boom!Segfault)


  • 主要错误是
    fsacnf(fIn,“%s”,nextLine)
    没有扫描完整的行。 发件人:

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

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


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

    的正确方法是:

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

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

    阅读:阅读:这个问题更多属于:正确点,但需要添加
    feof()
    不好,正确是
    而(fscanf(fIn,“%s”,nextLine)!=EOF){printf(“%s\n”,nextLine);}
    @grijesh我完全同意,正确的问题应该是:“三个错误是什么……”。因为这是大学里的一个问题,我怀疑忘记“\0”是故意犯的错误,但当然我可能是错的。没有
    scanf()
    fgets()
    这两个问题都是由@bsd@grijesh我从来没有想过使用
    fgets()
    可以解决长度问题,我只是说,它可以用于每行读取文件行。但是thanx在你的评论中,我已经编辑了我的帖子来清除我的意思是
    scanf()
    会删除空格,而
    fgets()
    不会。