在c中逐行读取整数

时间:2014-05-27 15:23:56

标签: c file text-files

我知道之前有人问过,但我找不到我要搜索的内容。

我有一个文本文件:

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

谢谢

2 个答案:

答案 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删除读取的结果。

Demo on ideone.

答案 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循环。