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

我有一个简单的以制表符分隔的整数(.txt文件)的文件,我希望用C语言逐行读取它们。 所以,说每行有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); } 

这是没有其他人建议的方式,不使用fscanf所以你可以有一个理智的error handling:

 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"%d"来读取字符,而是使用它(可能)调用的函数来执行转换: strtol 。 其中*scanf遍历字符串以匹配格式字符串,但不允许您在函数调用之间“保存您的位置”, strtol ,这是您需要读取任意数量的整数。

我没有为你编写所有代码 – 你必须进行硬error handling。 可能的错误包括:

  1. i == size ,在这种情况下,您可以尝试使用realloc使data更大。 或者,您可以遍历缓冲区并预先计算有多少数字,然后分配那么多,这样您以后就不需要重新分配。
  2. fgets没有读取整行(检查'\0'之前的最后一个字符是'\n' )。 在这种情况下,您可能想要重新填充缓冲区并继续读取数字。 在这种情况下要小心 – 您可能需要返回并重新计算最后一个数字 – fgets可能会将其切断。 (这是使用fgets一个缺点。)
  3. 错误的输入 – 你喜欢的句柄。
 #include  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; } } } 

我会做这样的事情:

 int storedVals[MAX_STORED_VALS]; int bf; int ii=0; while (!feof(fp) && ii 

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