簡體   English   中英

fscanf 分段錯誤:11

[英]fscanf Segmentation Fault: 11

我正在嘗試從 .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;
}

代碼的目標是在不知道文件中數字數量的情況下將未知數字存儲到數組中

為了這個讀取一個一個的浮動並在堆上分配數組。

當你寫

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

您在堆棧上分配一個具有一個值且永遠不會更改的數組。

而是將指針傳遞給函數並讓函數操作該指針

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

在您的函數內部從文件中讀取浮點值,並隨着需要的增加重新分配列表數組,例如

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

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM