请在本文末尾的编辑中查看 我有一个test.dat有2行。 在第一行是一个浮点数(5.0) 在第二行是两个整数,用"分隔。 *",例如4 * 3 正确显示浮点数(输出:5.0000),但未显示第二行。我的老师告诉我,我在while循环后犯了一个错误。 Fscanf读取文件的结尾,而不是开头。这就是为什么我将随机数作为输出,例如" 65746 * -8634364"我不知道,如何解决它。你的帮助会很好。这是我的C代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
float z1;
int z2,z3;
char line[255];
FILE *file;
file = fopen("test.dat", "r");
if (file==NULL)
{
printf("Error\n");
return 1;
}
fscanf(file, "%f", &z1);
printf("%f\n", z1);
while (fscanf(file, "%s", line) == 1)
{
fscanf(file, "%d*%d", &z2, &z3);
printf("%d * %d\n", z2,z3);
}
fclose(file);
return 0;
}
编辑:我按照第一个回答的说明后发出了新警告
警告代码:In function ‘main’:
main.c:21:2: warning: format ‘%s’ expects argument of type ‘char *’, but argument 3 has type ‘char (*)[255]’ [-Wformat=]
while (fscanf(file, "%s", &line) ==1)
^
编辑2:由于第一个答案,警告消失了!!还是一个问题:第二行的内容是&#34; 4 * 3&#34; ,我的输出是&#34; 0 * 0&#34;为什么呢?
答案 0 :(得分:4)
while (fscanf(file, "%s", &line) != EOF)
^ wrong argument is passed to %s
您将字符串读入line
,但line
被声明为char
变量 -
char line; // will invoke UB if no space is left for '\0'
因此,您需要将line
声明为char
数组。有点像这样 -
char line[255]; //make sure to leave a space for null character
注意 - 可能不会针对fscanf
测试EOF
,请按如下方式编写循环条件 -
while (fscanf(file, "%s", line)==1) //will return 1 only if it is successful
/* ^ note- don't pass here &line, just pass line */
答案 1 :(得分:1)
使用fscanf填充char变量。您应该使用char *,因为您在格式字符串中使用%s。