从文件中的一行读取任意数量的 space 分隔的字符
Reading an arbitrary number of space-separated chars from a line in file
我有一个文件,其中一行有任意数量的数字,可以作为整数读取。在一个最小的、可重现的示例中,我创建了一个文件 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
。最后它给出了一个分段错误,因为 i
增长大于 20,为 array
分配的 space。我不明白的是为什么打印了 600 多行,以及为什么我永远无法读取超出文件中数字 1
的内容。我错过了什么?
注意:我更喜欢使用 fgets
继续读取文件,因为这将是对读取整个文件的现有子例程的简单修改。
几件事:
- 您并没有将循环限制在
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
我有一个文件,其中一行有任意数量的数字,可以作为整数读取。在一个最小的、可重现的示例中,我创建了一个文件 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
。最后它给出了一个分段错误,因为 i
增长大于 20,为 array
分配的 space。我不明白的是为什么打印了 600 多行,以及为什么我永远无法读取超出文件中数字 1
的内容。我错过了什么?
注意:我更喜欢使用 fgets
继续读取文件,因为这将是对读取整个文件的现有子例程的简单修改。
几件事:
- 您并没有将循环限制在
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