2016-04-06 11 views
1

Der Versuch, eine Eingabe-TXT-Datei mit fscanf zu lesen und den Zeileninhalt in der int-Variablen, dem Array und dem 2D-Array zu speichern, damit ich den Wert später für die Berechnung verwenden kann. Ich denke, das Problem hier ist, weil ich das "EOF" nicht mit fscanf behandelt habe?C Segmentierungsfehler mit fscanf

Hier ist mein Code:

int main(){ 
FILE *fp; 

int n; // # resources 
int m; // # processes 
int avail[n]; 
int max[m][n], allo[m][n]; 
char temp1[10]; 

fp = fopen("test.txt", "r"); 
if (fp == NULL){ 
    exit(EXIT_FAILURE); 
} 


fscanf(fp, "%d %d", &n, &m); 
printf("%d %d", n, m); 
printf("\n"); 

// Store the second line content to allo[] 
for(int i = 0; i < n; i++){ 
    fscanf(fp, "%s", temp1); 
    avail[i] = atoi(temp1); 
    printf("%d ", avail[i]); 
} 
printf("\n"); 

// Store the line3-7 content to 2D max[][] 
for(int i = 0; i < m; i++){ 
    for(int j = 0; j < n; j++){ 
     fscanf(fp, "%s", temp1); 
     max[i][j] = atoi(temp1); 
     printf("%d ", max[i][j]); 
    } 
    printf("\n"); 
} 

// Store the line8-12 content to 2D allo 
for(int i = 0; i < m; i++){ 
     for(int j = 0; i < n; j++){ 
      fscanf(fp, "%s", temp1); 
      allo[i][j] = atoi(temp1); 
      printf("%d ", allo[i][j]); 
     } 
     printf("\n"); 
} 


fclose(fp); 
return 0; 
} 

Hier ist die .txt-Eingabedatei:

3 5 
9 6 3 
5 5 2 
4 1 3 
8 3 4 
5 4 2 
4 4 3 
0 1 0 
1 1 0 
1 0 2 
0 0 1 
1 2 2 

Und hier ist der Ausgang:

3 5 
9 6 3 
5 5 2 
4 1 3 
8 3 4 
5 4 2 
4 4 3 
Segmentation fault: 11 
+5

'int max [m] [n], allo [m] [n], müssen [n] [m];' ... 'm' und' n' nicht initialisiert worden ist, so ist es * undefined Verhalten*. Abgesehen davon ändern sich die VLAs nicht selbst, wenn Sie die Variable ändern, mit der Sie sie definiert haben. Ich bemerke auch, dass 'm' und' n' in 'need [n] [m]' transponiert sind. –

+0

Bitte ändern Sie die Frage nicht, um die Probleme zu beheben. Tun Sie das auf Ihrem eigenen Schreibtisch, oder es macht den Dialog irrelevant. –

Antwort

0

Sie int max[m][n], allo[m][n], need[n][m] während m erklären und n sind noch nicht festgelegt, so dass sie von unbekannter Größe sind. Sie werden nicht die Größe ändern, nachdem die Größen festgelegt sind. Also auf diese Schreiben gibt Ihnen "undefiniertes Verhalten"

1

Das Problem ist hier:

int n; // # resources 
int m; // # processes 
int avail[n]; 
int max[m][n], allo[m][n], need[n][m]; 

n und m sind nicht initialisiert, wenn Sie die 2D-Array deklarieren max. Versuchen Sie, n und m vor int max[m][n]; usw. zu drucken, und Sie werden sehen, dass sie Garbage-Werte enthalten.

Als Ergebnis undefined Verhalten ist, was Sie erleben, da Sie nicht wirklich sagen können, was die Größe Ihres Arrays ist.

ändern es dazu:

int n; // # resources 
int m; // # processes 

fscanf(fp, "%d %d", &n, &m); 
printf("%d %d", n, m); 

int avail[n]; 
int max[m][n], allo[m][n], need[n][m]; 

Nun, wenn Sie Ihre Arrays erstellen, n und m wird mit den aus der Datei gelesenen Werte initialisiert werden.


Wenn Sie Ihre Arrays deklarieren möchten, bevor n und m lesen, dann sollten Sie Zeiger verwenden, lesen n und m und dann dynamically allocate the arrays.

+0

aber immer noch seg Fehler bei der Verwendung von fscanf – fruitlancer122

+0

@ fruitlancer122 Überprüfen Sie mein Update! – gsamaras

+0

Kann ich n & m zuerst auf 0 initialisieren, und dann wird fscanf einen Wert von der Eingabe zurück zu n & m zurückgeben. Dann ist jetzt n & m nicht undefiniert. Wie auch immer, ich bearbeite es mit Ihrer Änderung, aber immer noch Seg Fehler. Ich denke das Problem ist das fscanf wenn es bis zur Enddatei "line terminated" reicht. – fruitlancer122

0

Da m, n nicht initialisiert, wenn Sie am Anfang der Datei Ihre Arrays deklariert:

int avail[n]; 
int max[m][n], allo[m][n], need[n][m]; 

als @WeatherVane in den Kommentaren erwähnt, werden Sie nicht definiertes Verhalten bekommen. Vielleicht überschreibst du einen anderen Teil des Programmspeichers (wer weiß, dass es undefiniert ist!).

Wenn Sie dynamische Array-Erstellung benötigen, sollten Sie etwas wie das folgende tun:

int* avail; 
... 
fscanf(fp, "%d %d", &n, &m); 
avail = (int*)malloc(n*sizeof(int)); 
0

Bei der Initialisierung max, allo und brauchen. der Wert von n und m ist nicht definiert.

Sie können max, allo und need als int** definieren.

Nachdem Sie den Wert von n und m gescannt haben, können Sie die unten Funktion aufrufen Speicher für über 2D-Arrays zuzuweisen.

int ** get2DintArray(int r, int c){ 
    int **arr = (int **)malloc(r * sizeof(int *)); 
    for (i=0; i<r; i++) 
     arr[i] = (int *)malloc(c * sizeof(int)); 
    return arr; 
} 

Für. z: -

allo = get2DintArray(m,n); 
need = get2DintArray(n,m); 

Dieser Ansatz wird für höhere Werte von n und m handlich sein, wobei der Stapelspeicher nicht ausreichend sein kann, weil man in diesem Fall Heap-Speicher verwenden.

+1

Sie haben vergessen, 'arr;' zurückzugeben. –

+0

Danke für den Kopf! Du hättest es auch direkt editieren können! –