2016-10-23 127 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; 
    } 

...