我试图从我的c程序中的文本文件中读取一些数据但是获取垃圾值。
以下是文件
中的输入格式3442
Tack Hammer
9
3.550000
ABC317
这是我读取此文件数据的代码
char name[100];
int product_code;
fscanf(fin, "%d", &x[i].product_code); //taking id from file is fine
printf("\n%d\n",x[i].product_code); // works correctly
fscanf(fin,"%[^\n]",name);
printf("Data from file:\n%s",name); // it displays junk values
这是输出预览
请有人纠正我。谢谢
答案 0 :(得分:4)
让我们浏览一下代码。
char name[100];
创建一个100字节长的char
数组。它未初始化并包含“垃圾”。
fscanf(fin, "%d", &x[i].product_code);
从3442
扫描fin
。
printf("\n%d\n",x[i].product_code);
打印换行符,上面的fscanf
扫描的数字和换行符。这条线
fscanf(fin,"%[^\n]",name);
是导致问题的原因。要读取的下一个字符是\n
,一个换行符。如果下一个字符是%[^\n]
, \n
将失败。因此,fscanf
失败并返回零。
printf("Data from file:\n%s",name);
打印Data from file
,换行符和name
包含的“垃圾”。
在第一个getc(fin);
之后使用fscanf
阅读并弃掉\n
个字符。
答案 1 :(得分:2)
第一次调用fscanf()不会消耗换行符
对fscanf()的第二次调用失败(这是一个非常好的理由,总是检查来自任何scanf系列函数的返回值。)
在第二次调用fscanf()时,插入一个' ' (空格)作为格式字符串的第一个字符将导致跳过任何空格。 (换行符是空格)
答案 2 :(得分:1)
您的错误在:
fscanf(fin,"%[^\n]",name);
因为你正在接受\n
; fscanf
将失败。变量name
将不会被填充,因此它包含垃圾。您需要再读一个字符以避免\n
并继续。
答案 3 :(得分:-2)
我相信这是因为你没有初始化name
。
char name[100] = { 0 };