fgets和sscanf将文件读入数组

时间:2015-07-21 17:53:34

标签: c++

我正在尝试实现一个函数来读取包含2个double和int的txt文件,并以空格作为分隔符,例如(data.txt):

3.1 2.5 1

3.4 4.5 2

.....

我实现了下面的函数,它将文件名作为参数,指向2 double和int。每个指针将用于从文件中检索列。我用了     与fgets 得到线然后     sscanf的 从行中提取三个值。该程序在运行时崩溃(错误:Windows已触发program.exe中的breakpont)

...当我在从主函数返回之前设置一个断点时,检索到的值会被纠正,但是当我点击继续时程序会崩溃。

为了调试该函数,我将以下代码行添加到下面的函数ReadFile中:

if (buf[strlen(buf)-1] != '\0') 
{ 
    putchar(buf[strlen(buf)-1]); //surprisingly this line prints 1 instead of a space... 
    exit(1);
}

通过此更改,代码退出而不会到达函数的末尾。我不明白这一点,因为buf变量足够长,可以保存样本文件中一行的所有字符。

感谢您提出解决此问题的意见。

谢谢。

bool ReadFile(const char* fileName, double* x, double* y, int* t, int size)
{
    FILE* fp;   
    char    buf[5000];
    fp = fopen( fileName, "r" );

    for( int i = 0; i < size && fgets(buf, 5000, fp) != NULL; i++)  
    {
        buf[strlen(buf)-1] = '\0'; 
        if (buf[strlen(buf)-2] != '\0') 
        {    
            putchar(buf[strlen(buf)-1]);//surprisingly this line prints 1 instead of a space...
            exit(1);       
        }

        sscanf(buf, "%lf %lf %d", &x[i], &y[i], &t[i]);


    }

    fclose(fp);
    return true;
}

1 个答案:

答案 0 :(得分:0)

问题在于调用者,大小设置为1而不是数据文件中的行数。