我有一个文件,它在一行中有任意数量的数字可以读取为整数。在一个最小的,可重复的例子,我创建了一个只包含以下行文件test.dat
:从文件中的一行中读取任意数量的空格分隔的字符
1 2 3 4
然后我尝试使用fgets
和strtok
来实现这一目标:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
FILE* fileptr;
fileptr = fopen("test.dat","r");
char line[500];
char *token;
int array[20];
int i = 0;
fgets(line,300,fileptr);
token = strtok(line," ");
array[i] = atoi(token);
printf("%d\n", array[i]);
i++;
while(token != NULL){
token = strtok(line," ");
array[i] = atoi(token);
printf("%d\n", array[i]);
i++;
}
return 0;
}
但这会导致印刷21行1
's,接着是0
的632行。最后它给出了分段错误,因为i
增长大于20,分配的空间为array
。我不明白的是为什么会打印600多行文件,以及为什么我永远无法读取文件中的数字1
以外的内容。我错过了什么?
注意:我更愿意继续阅读文件fgets
,因为这将是对读取整个文件的现有子程序的简单修改。
嗯,不清楚为什么在'与fgets(线,300,fileptr)300;'。我期望'fgets(line,sizeof line,fileptr);' – chux
@chux没有很好的理由 - 我没有写出原来的代码来自哪一行。我会解决它。谢谢。 – sodiumnitrate
如果目标是获得“空格分隔的字符”,那么'strtok()'很好。然而,由于该令牌立即运行atoi(),因此使用'strtol()'而不是'strtok()/ atoi()'更有意义,因为[解析多个空格分隔的整数的字符串](https:/ /stackoverflow.com/q/28233450/2410359) – chux