我有一个简单的以制表符分隔的整数(.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);
}
答案 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
会这样做,这是您需要读取任意数量的整数
我没有为您编写所有代码 - 您必须进行硬错误处理。可能的错误包括:
strtol
,在这种情况下,您可以尝试使i == size
更大data
。或者,您可以循环缓冲区并预先计算有多少数字,然后分配那么多,以便您以后不需要重新分配。realloc
未读取整行(请检查fgets
之前的最后一个字符是'\0'
)。在这种情况下,您可能需要重新填充缓冲区并继续读取数字。在这种情况下要小心 - 您可能需要返回并重新计算最后一个数字 - '\n'
可能会将其删除。 (这是使用fgets
的一个缺点。)答案 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(换行符)以查找下一个整数。当然,这不会通过纠错来做很多事情。