在C上写入和显示格式的流

时间:2011-11-07 03:06:30

标签: c scanf printf

我正处于计算机科学的第一年,我必须设计一个程序,该程序写入格式为fprintf的文件,并以格式(fscanf)显示。但是我无法让它正常运行;它会编译,但当它到达fscanf部分时,它会崩溃。我一直在寻找参考网站,YouTube视频和东西,但我无法让它工作,没有任何成功。

除了最后两行代码之外,它确实做得很好。它能够在.txt文件中写入我输入的记录。问题在于使用fscanf本身。

void write_with_format()
{
    char  name_of_file[100] = "grades.txt";
    FILE *arch;
    arch = fopen (name_of_file, "a");
    char name[50];
    char career[50];
    char grades[100];
    char total;
    printf("Give me the name");
    gets(name);
    printf("Give me the career");
    gets(career);
    printf("Give me the grade");
    gets(grades);

    getchar();
    fprintf (arch, "%s,%s,%s\n",name,career,grades);

    fscanf(arch,"%s %s %f",&name,&career,&grades);

    printf("%s %s %f",name,career,grades);
}

感谢您对我的代码或正确使用fscanf的任何帮助,谢谢大家。

2 个答案:

答案 0 :(得分:3)

  1. 这一行都错了:

    fscanf(arch,"%s %s %f",&name,&career,&grades);

    grades被声明为char grades[100];,即。一个字符串,但是您正试图将float读入其中。同样适用于它下方的printf行,您正在使用%f并告诉printf您正在传递一个浮点数,但是您正在传递一个数组。在将数组传递给函数时,您也不需要使用地址 - 运算符(&),就像使用fscanf一样。

    < / LI>
  2. 在阅读/写入文件后,您应该使用fclose来刷新缓冲区并关闭文件流。

  3. 返回fscanf行,您对此有何期待? 文件位置inidcator 位于文件的末尾,就在您附加 fprintf生成的行之后。检查fscanf的返回值,您就会看到它返回EOF报告错误。特定错误值存储在errno

  4. 您可以使用rewindfseek将位置设置为文件的开头或返回一定数量,或者您可以随时重新打开文件。我知道我至少不会在write_with_format函数中使用我的读取代码。

  5. gets不安全,不应该使用,因为它有可能导致缓冲区溢出,请改用fgets(stdin, SIZE...)

  6. 调高编译器警告。如果您偶然使用gcc,则标记为-Wall。仅仅因为你的代码编译,并不代表它能够正常运行(或根本不运作)。

答案 1 :(得分:0)

您将成绩声明为char的数组,但正试图将其读入浮点数。