从文件中的一行读取任意数量的以空格分隔的字符

时间:2017-09-07 19:41:33

标签: c fgets strtok

我有一个文件,在一行中有一个任意数量的数字可以作为整数读取。在一个最小的,可重现的示例中,我创建了一个仅包含以下行的文件test.dat

 1 2 3 4

然后我尝试使用fgetsstrtok来实现这一目标:

#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读取文件,因为这将是对读取整个文件的现有子例程的简单修改。

1 个答案:

答案 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