我知道之前有人问过,但我找不到我要搜索的内容。
我有一个文本文件:
1 2 3 .
2 3 4 5
3 1 2 .
我有4个数组,我需要将每个数字放在其中一个的行上 这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
FILE *file = fopen("d:\\rf.txt", "r");
int ch[3];
int a[3],b[3],c[3];
int z,x,t,v,i;
if (file == NULL) return 1;
for(i=1;i<=3;i++)
{
fscanf(file,"%d %d %d %d",&z,&x,&t,&v);
ch[i]=z;
a[i]=x;b[i]=t;c[i]=v;
printf("%d %d %d %d\n",ch[i],a[i],b[i],c[i]);
}
return 0;
}
这就是我得到的:
1 2 3 0
1 2 3 0
1 2 3 0
谢谢
答案 0 :(得分:2)
您的代码到达输入文件中有一个点'.'
符号的位置,然后停止。由于它无法使用%d
格式说明符读取它,因此它不会使读指针前进,因此输入的其余部分基本上被忽略。
以下是解决此问题的一种方法:
// int z,x,t,v,i; <<== Comment this out
if (file == NULL) return 1;
for(i=0;i<3;i++) { // <<= Note that indexes go from 0 to 2, not from 1 to 3
int z;
if (fscanf(file,"%d",&z) == 1) {
ch[i]=z;
} else {
ch[i]=0;
fscanf(file,"%*s"); // Ignore the input
}
if (fscanf(file,"%d",&z) == 1) {
a[i]=z;
} else {
a[i]=0;
fscanf(file,"%*s"); // Ignore the input
}
if (fscanf(file,"%d",&z) == 1) {
b[i]=z;
} else {
b[i]=0;
fscanf(file,"%*s"); // Ignore the input
}
if (fscanf(file,"%d",&z) == 1) {
c[i]=z;
} else {
c[i]=0;
fscanf(file,"%*s"); // Ignore the input
}
printf("%d %d %d %d\n",ch[i],a[i],b[i],c[i]);
}
请注意在读取要忽略的数据的行上使用带有%s
格式的星号。星号*
告诉fscanf
删除读取的结果。
答案 1 :(得分:2)
首先 - 你的for循环不是真的,我认为你的意思并不是这样。
它应该是for(i = 0 ; i < 3 ; i++)
,因为由常量SIZE初始化的数组从0开始并继续到SIZE-1,因此数组int a[3]
将具有a[0], a[1], a[2]
而不是a[1], a[2], a[3]
。
关于代码的其余部分......
1 2 3 .
2 3 4 5
3 1 2 .
是文件所以.
应该是什么意思?它不是一个整数,它将被转换为它的ASCII值(在谷歌上查找更多信息),这基本上是一个从0到255的值,代表一个字符 - 所以它实际上不会是一个错误读数,但我不认为这是你的意思。
这些是这些代码的唯一问题,我试过它并且工作得很好......
只需更改for循环。