2016-10-23 8 views
-2

Ich versuche, Daten aus einer .tsv4-Datei zu erhalten. Immer wenn der Code ausgeführt wird, kehrt er mit einem Segmentierungsfehler zurück: 11. Das Ziel des Codes besteht darin, die unbekannten Zahlen in einem Array zu speichern, ohne die Anzahl der Zahlen in der Datei zu kennen. Die Datei, auf die ich zugreifen möchte, hat 92 Gleitkommawerte und speichert sie ordnungsgemäß. Aber es wird immer noch den Segmentierungsfehler geben. Ich weiß, das wegen eines Speicher Problem ist, nur nicht sicher, wie es zu handhabenfscanf Segmentierung Fehler: 11

Die Datei aus der Leitung 24, um die Segmentierungsfehler zu bekommen scheint

#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

Du hast nicht zuteilen genügend Speicher .... Aber im Ernst zu bekommen, wir müssen Ihren Code sehen, wenn Sie wirklich Hilfe brauchen – UnholySheep

+0

Bitte Sir - kann ich einen Höhepunkt im Code haben? –

+0

Das ist kein Code, das ist ein Bild. – melpomene

Antwort

1

Das Ziel des Codes zu speichern, ist die unbekannte Zahlen in ein Array ohne in der Datei zu lesen dieser

um die Menge von Zahlen zu kennen schwimmt nacheinander und das Array auf dem Heap zuzuteilen.

Wenn Sie

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

schreiben ordnen Sie ein Array mit einem Wert auf dem Stack und das kann sich nie ändern.

Statt einen Zeiger auf die Funktion übergeben und lassen Sie die Funktion, die Zeiger manipulieren

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

In Ihrer Funktion die Float-Werte aus der Datei und wie die Notwendigkeit erhöht realloc die Liste Array Z. B. lesen

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 
} 

Am Ende realloc wieder mit der aktuellen Anzahl von Schwimmern, die richtige Größe

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

...

Verwandte Themen