【问题标题】:Segmentation Fault after reading a file into a struct array将文件读入结构数组后出现分段错误
【发布时间】:2016-11-30 00:16:42
【问题描述】:

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

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);

    }
}

【问题讨论】:

  • 第一个问题:你需要打开文件。看看fopen
  • @Mason:您可以通过单击分数下方的灰色复选标记来接受其中一个答案。

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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:

      结构天气 loc1; memset(&loc1, 0, sizeof(struct Weather));

      M1:

      struct Weather loc1 = {0};

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

    【讨论】:

      【解决方案3】:

      您的代码中存在多个问题:

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

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

        char buffer[ROWS][COLS];
        
      • 您应该为循环计数器和二维数组定义使用相同的常量:ROWS 可能被定义为小于 200 的值。

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

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

      • 是否初始化loc1取决于parseLine()函数的作用。 parseLine() 对目标结构的内容不做任何假设是有道理的,但源尚未发布,因此我们无法确定。

      • double 类型的 printf 格式说明符是 %f,多余的 l 将被忽略。

      【讨论】:

        猜你喜欢
        • 2016-08-19
        • 1970-01-01
        • 2015-02-15
        • 2020-04-04
        • 2021-06-09
        • 2021-07-01
        • 2021-07-23
        • 1970-01-01
        相关资源
        最近更新 更多