2016-10-23 122 views
-2

我想从.tsv4文件中获取数据。无论代码何时运行,它都会返回一个段错误:11.代码的目标是将未知数字存储到数组中,而不知道文件中的数字量。我正在尝试访问的文件有92个浮点值,并将其正确存储。但它仍然会导致分段错误。我知道这是因为内存问题的,只是不知道应该如何处理呢fscanf分割错误:11

该文件似乎得到线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

你没有分配足够的内存....虽然严重,如果您需要任何真正的帮助,我们需要查看您的代码 – UnholySheep

+0

请先生 - 我可以在代码中获得一个高峰吗? –

+0

这不是代码,那是一张图片。 – melpomene

回答

1

分段错误代码的目的是存储未知数到一个数组 而不为了知道该文件

在数量的量这个读漂浮逐个和在堆上分配阵列。

当编写

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

你分配与在堆栈上一个值的数组,可以永远不会改变。

指针而是传递给函数,并让功能操作该指针

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

里面的功能从文件中读取浮点值,并在需要增加的realloc列表阵列例如

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 
} 

在花车的当前数量再次年底的realloc可以得到正确的大小

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

...