如何读取C中以制表符分隔的整数的文本文件?

时间:2011-03-18 19:56:37

标签: c

我有一个简单的以制表符分隔的整数(.txt文件)的文件,我希望逐行读取它们。所以,说每行有5个整数。我怎么能做到这一点?

我的第一次尝试如下。它只是读取一个整数,但即使这样也不起作用:

    FILE *fp;
    char blah[255];
    int *some_int;
fp = fopen("test.txt", "rt");
while (fgets(blah, 255, fp) != NULL)
{
    sscanf(blah, "%d", some_int);
    printf("%d\n", *some_int);
}

3 个答案:

答案 0 :(得分:3)

以下是没有其他人建议的方法,它不使用fscanf,因此您可以进行合理的错误处理:

char buffer[BUFSIZE];
size_t size = 5;
int *data = malloc(size * sizeof *line);

if(line == NULL) error();

while(fgets(buffer, sizeof buffer, fp)
  {
    size_t i = 0;
    char *next = buffer;
    while(*next && *next != '\n')
      {
        data[i++] = strtol(next, &next, 0);
        // check for errors
      }
  }

基本上,不是尝试使用*scanf的{​​{1}}来读取字符,而是使用它(可能)调用的函数来执行转换:"%d"。其中strtol遍历字符串以匹配格式字符串,但不允许您在函数调用之间“保存您的位置”,*scanf会这样做,这是您需要读取任意数量的整数

我没有为您编写所有代码 - 您必须进行硬错误处理。可能的错误包括:

  1. strtol,在这种情况下,您可以尝试使i == size更大data。或者,您可以循环缓冲区并预先计算有多少数字,然后分配那么多,以便您以后不需要重新分配。
  2. realloc未读取整行(请检查fgets之前的最后一个字符是'\0')。在这种情况下,您可能需要重新填充缓冲区并继续读取数字。在这种情况下要小心 - 您可能需要返回并重新计算最后一个数字 - '\n'可能会将其删除。 (这是使用fgets的一个缺点。)
  3. 错误的输入 - 你喜欢的句柄。

答案 1 :(得分:2)

#include <stdio.h>
int main(){
    FILE *fp;
    int scanned = 0;
    int some_ints[5];
    fp = fopen("test.txt", "r");
    while ((scanned = fscanf(fp, "%d %d %d %d %d", some_ints, some_ints+1, some_ints+2, some_ints+3, some_ints+4)) !=  EOF) {
        if(scanned ==5){
            printf("%d %d %d %d %d\n", some_ints[0], some_ints[1], some_ints[2], some_ints[3], some_ints[4]);
        }
        else {
            printf("Whoops! Input format is incorrect!\n");
            break;
        }
    } 
}

答案 2 :(得分:1)

我会做这样的事情:

int storedVals[MAX_STORED_VALS];
int bf;
int ii=0;

while (!feof(fp) && ii<MAX_STORED_VALS) {
  if (fscanf(fp," %d",&bf)) {
    storedVals[ii++]=bf;
  }
}

fscanf自动进行空白区域修剪。因此,只要扫描字符串中有空格,它就会删除零个或多个\ t(制表符)和\ n(换行符)以查找下一个整数。当然,这不会通过纠错来做很多事情。