fscanf分段故障:11

时间:2016-10-23 17:34:35

标签: c segmentation-fault

我正在尝试从.tsv4文件中获取数据。每当代码运行时,它返回一个分段错误:11。代码的目标是将未知数字存储到数组中,而不知道文件中的数字量。我正在尝试访问的文件有92个浮点值,并且它正确存储它们。但它仍然会给出分段错误错误。我知道这是因为内存问题,只是不确定如何处理它

该文件似乎从第24行获得了分段错误

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

int getFileInfo(const char *filename, float list[]);

int main(void)
{
    float list[] = {0};
    int size = getFileInfo("numbers.tsv4",list);
    return 0;
}

int getFileInfo(const char *filename, float list[])
{
    FILE* spData;
    if((spData = fopen(filename, "r")) == NULL)
    {
        fprintf(stderr, "Error opening file %s.\n",filename);
        exit(1);
    }

    int i = 0;
    while(fscanf(spData, "%f", &list[i]) != EOF)
    {
        i++;
    }

    if (fclose(spData) == EOF) 
    {
        fprintf(stderr, "Error closing file %s.\n", filename);
        exit(2);
    }
return i + 1;
}

1 个答案:

答案 0 :(得分:1)

  

代码的目标是将未知数字存储到数组中   不知道文件中的数字量

为了使这个读取逐个浮动并在堆上分配数组。

写作时

float list[] = {0};
int size = getFileInfo("numbers.tsv4",list);

你在堆栈上分配一个带有一个值的数组,并且永远不会改变。

而是传递指向函数的指针,让函数操作该指针

float* list = NULL;
int size = getFileInfo("numbers.tsv4",&list);

在函数内部读取文件中的浮点值,并根据需要增加重新分配列表数组E.g。

int size = 10; // lets start with 10 values
int readFloats = 0; // number of floats read
*list = malloc(sizeof(float)*size);

...

if (readFloats > size)
{
  float* tmp = realloc(*list, sizeof(float)*(size+10));
  if ( tmp != NULL )
  {
    size += 10;
    *list = tmp;
  }
  ... put in the float
}

最后再次使用当前浮动数重新分配以获得正确的大小

 tmp = realloc(*list, readCurrent*sizeof(float));
 if ( tmp != NULL )
  {
    size = readCurrent;
    *list = tmp;
  }

...