问题描述
我正在尝试从文本文件中读取两个数字。我使用了 strtok
,分隔符是 " "
。文本文件(名为data.txt)文件只有两个数字,行是"3 5"
。但是程序崩溃了……感谢您的帮助。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
FILE *data;
data = fopen("data.txt","r");
int m,n;
char *line,*number;
while(!feof(data))
{
fscanf(data,"%s",line);
number = strtok(line," ");
m = atoi(number);
number = strtok(NULL," ");
n = atoi(number);
}
}
解决方法
line
是一个未初始化的指针,它不指向任何有效的内存位置,所以你不能用它来存储数据,而是使用数组。
while(!feof(data))
is not what you'd want to use 来控制你的阅读周期。
使用 fgets
/sscanf
解析值,简单易行的方法:
FILE *data;
data = fopen("data.txt","r");
int m,n;
char line[32];
if (data != NULL)
{
while (fgets(line,sizeof line,data)) // assuming that you want to have more lines
{
if(sscanf(line,"%d%d",&m,&n) != 2){
// values not parsed correctly
//handle parsing error
}
}
}
或作为 @chux pointed out,检测线路上的额外垃圾:
char end;
if(sscanf(line,"%d%d %c",&n,&end) != 2) {
// if more characters exist on the line
// the return value of sscanf will be 3
}
如果文件中的值可能超出 int
的范围,请考虑使用 strtol
而不是 sscanf
。