我正处于计算机科学的第一年,我必须设计一个程序,该程序写入格式为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
的任何帮助,谢谢大家。
答案 0 :(得分:3)
这一行都错了:
fscanf(arch,"%s %s %f",&name,&career,&grades);
grades
被声明为char grades[100];
,即。一个字符串,但是您正试图将float
读入其中。同样适用于它下方的printf
行,您正在使用%f
并告诉printf
您正在传递一个浮点数,但是您正在传递一个数组。在将数组传递给函数时,您也不需要使用地址 - 运算符(&
),就像使用fscanf
一样。
在阅读/写入文件后,您应该使用fclose
来刷新缓冲区并关闭文件流。
返回fscanf
行,您对此有何期待? 文件位置inidcator 位于文件的末尾,就在您附加 fprintf
生成的行之后。检查fscanf
的返回值,您就会看到它返回EOF
报告错误。特定错误值存储在errno
。
您可以使用rewind
或fseek
将位置设置为文件的开头或返回一定数量,或者您可以随时重新打开文件。我知道我至少不会在write_with_format
函数中使用我的读取代码。
gets
不安全,不应该使用,因为它有可能导致缓冲区溢出,请改用fgets(stdin, SIZE...)
。
调高编译器警告。如果您偶然使用gcc,则标记为-Wall
。仅仅因为你的代码编译,并不代表它能够正常运行(或根本不运作)。
答案 1 :(得分:0)
您将成绩声明为char的数组,但正试图将其读入浮点数。