我正在尝试编写一个从文件中读取的小程序。我从包含以下数字的文件(random.dat)中尝试了这些代码:
0.575 0.235
0.456 0.322
我写的代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 2
int main (void) {
FILE *fp;
int i, j;
double x,y,data[N][N] = {{0}};
if ((fp = fopen("random.dat", "r")) == NULL ) {
printf("Error\n");
exit(EXIT_FAILURE);
}
fp = fopen("random.dat","r");
printf("\n");
for (i=0;i<N;i++){
fscanf(fp,"%lf",&x);
for(j=0;j<N;j++){
fscanf(fp,"%lf",&x);
data[i][j] = x;
printf("data[%d][%d]=%lf\n",i,j,data[i][j]);
}
}
printf("\n");
fclose(fp);
return(0);
}
代码编写得好吗?
我不明白为什么终端写道:
data[0][0]=0.235000
data[0][1]=0.465000
data[1][0]=0.322000
data[1][1]=0.322000
而不是:
data[0][0]=0.575000
data[0][1]=0.235000
data[1][0]=0.465000
data[1][1]=0.322000
有什么想法吗?谢谢!
答案 0 :(得分:1)
在这个嵌套循环中(重新格式化以便于阅读):
for (i=0; i<N; i++)
{
fscanf(fp, "%lf", &x); // first fscanf
for(j=0; j<N; j++)
{
fscanf(fp, "%lf", &x); // second fscanf
data[i][j] = x;
printf("data[%d][%d]=%lf\n", i, j, data[i][j]);
}
}
您将看到内部循环立即覆盖外部循环中读取的x
值。这意味着你基本上完全跳过了读取文件中的第一个数字。之后会导致其中一个内循环fscanf
调用失败,但由于您没有检查返回值,因此您的程序不会注意到。
只需删除第一条fscanf()
行,即可进行设置。
除了编辑之外,如果您使用调试器逐步执行程序,您会立即看到此问题。
答案 1 :(得分:0)
替换陈述,
for (i=0;i<N;i++){
fscanf(fp,"%lf",&x);
for(j=0;j<N;j++){
fscanf(fp,"%lf",&x);
data[i][j] = x;
printf("data[%d][%d]=%lf\n",i,j,data[i][j]);
}
}
与
for (i=0;i<N;i++){
for(j=0;j<N;j++){
fscanf(fp,"%lf",&x);
data[i][j] = x;
printf("data[%d][%d]=%lf\n",i,j,data[i][j]);
}
}