将文件读入结构数组后出现分段错误

时间:2016-11-30 00:16:42

标签: c

我正在尝试编写一个从文件中读取数据并将其放入struct数组的程序。我已经成功地将它放入数组中但我得到了一个分段错误。我相信我必须使用malloc初始化struct数组,但我是编程新手,并不真正理解如何做到这一点。谢谢你的帮助!我复制了我的代码片段,这样你就可以看到我做了什么。我没有在此代码中包含我的函数。

struct Weather
{
    char location;
    int daynum;
    double temp;
    double precip;
};

int main (void)
{
    FILE*openFile;
    char buffer[COLS][ROWS];
    int i = 0;
    struct Weather loc1; //initialize here?

    for (i = 0; i <200; i++)
    {
        fgets (buffer[i], ROWS, openFile);
        parseLine(buffer[i], &loc1);
        printf ("%d %c %d %.2lf %.2lf\n",i, loc1.location, loc1.daynum, loc1.temp, loc1.precip);

    }
}

3 个答案:

答案 0 :(得分:1)

您的文件流(openFile)未初始化;它实际上并不指向文件。正如yanocomment中所述,请使用fopen()以正确初始化文件指针。

答案 1 :(得分:1)

  1. 在进行任何I / O操作之前,必须使用fopen()初始化文件流!

    int main()
    {
        char filename[64];
        FILE *fp;
    
        snprintf(filename, sizeof(filename), "hello1234.txt");
        if(NULL == (fp = fopen(filename, "r")))
        {
            printf("err, failed when fopen(), %s %s[%d].\n", __FILE__, __FUNCTION__, __LINE__);
            return -1;
        }
        //your code here
    
        return 0;
    }
    
  2. 初始化结构

    请注意,malloc()无法初始化结构。

    两种方法:

    M0:

    struct Weather loc1; memset(&amp; loc1,0,sizeof(struct Weather));

    M1:

    struct Weather loc1 = {0};

  3. man malloc或点击malloc manual的链接。

答案 2 :(得分:0)

代码中存在多个问题:

  • 流指针openFile未初始化,调用fgets()会调用未定义的行为。您要为fopen()打开文件,或将openFile的值设置为标准输入流stdin

  • 2D char数组应按其他顺序定义:

    char buffer[ROWS][COLS];
    
  • 你应该对循环计数器和2D数组定义使用相同的常量:ROWS可能被定义为小于200的东西。

  • 行缓冲区的大小为COLS,将其传递给fgets()

  • 你应该测试fgets()的返回值:它在文件末尾返回NULL,在这种情况下目标数组的内容是不确定的。

  • 是否初始化loc1取决于parseLine()函数的作用。 parseLine()对目标结构的内容没有做出任何假设是有意义的,但是来源尚未发布,所以我们无法确定。

  • printf类型的double格式说明符为%f,只会忽略额外的l