试图从文本文件中读取两个数字

问题描述

我正在尝试从文本文件中读取两个数字。我使用了 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