我有一个文件,在一行中有一个任意数量的数字可以作为整数读取。在一个最小的,可重现的示例中,我创建了一个仅包含以下行的文件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
,然后是632行0
&#39}。最后,它给出了一个分段错误,因为i
增长大于20,为array
分配了空间。我不明白为什么会打印600多行,以及为什么我永远无法读取文件中的数字1
。我错过了什么?
注意:我更喜欢继续使用fgets
读取文件,因为这将是对读取整个文件的现有子例程的简单修改。
答案 0 :(得分:1)
一些事情:
array
strtok
是错误的。初始发生strtok
的延续应指定NULL
作为第一个参数。有关更多信息和用法示例,请参阅strtok
的文档。解决这些问题的一个例子是:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
FILE* fileptr = fopen("test.dat","r");
if (fileptr == NULL)
{
perror("Failed to open file: ");
return EXIT_FAILURE;
}
char line[500];
int array[20];
const size_t max_size = sizeof array / sizeof *array;
size_t i = 0;
if (fgets(line,300,fileptr))
{
char *token = strtok(line," ");
while (i < max_size && token != NULL)
{
array[i] = atoi(token);
printf("%d\n", array[i]);
++i;
token = strtok(NULL, " ");
}
// use array and i for whatever you needed
}
return EXIT_SUCCESS;
}
<强>输出强>
1
2
3
4