2011-06-10 70 views
-1

即時試圖從一個文件的文件的設置是這樣讀出的數據:將數據讀入2個陣列

3050 76 
2030 60 
1600 70 
2222 50 
2430 60 
2800 50 
0 0 

第一個數字代表一個學生ID,第二個數字代表學生的 級時程序達到0 0時,應該停止從文件讀取

這裏是一個程序的例子,它沒有從文件中讀取,因爲出現一個稱爲SEGMENTATION FAULT的錯誤。我正在使用Ubuntu的,這是發生此錯誤

// this is the grading sorting program for part one 


#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 50 

int main(int argc, char **argv) 
{ 
    FILE* fp; // file pointer, points to the file 
    char file_name[32]; // store file name 

    int ID[SIZE]; 
    int grade[SIZE]; 

    int a,b; // index variables 

    int student_id, grades; 

    // opening file by asking the user for the file name 
    printf("Enter the name of the file containing the grades\n"); 
    scanf("%s",file_name); 

    fp=fopen("file_name", "r"); 

    /*fp = fopen("grades.txt", "r");*/ 

    // read in data into the arrays 
    for (a = 0; a <= SIZE; a++) 
    { 
     fscanf(fp,"%d", &student_id); 
     ID[a] = student_id; 

     for(b = 0; b <= SIZE; b++) 
     { 
      fscanf(fp,"%d", &grades); 
      grade[b] = grades; 
     } 

     if(ID[a] == 0 && grade[b] == 0) 
      break; 
    } 

    fclose(fp); 
    return 0; 
} 
+2

這看起來像功課 – rerun 2011-06-10 21:22:14

+0

是文件名超過32個字符?另外,如果這是家庭作業,您應該這樣標記它。 – 2011-06-10 21:22:49

回答

0

一個提示你正在閱讀許多值。你有一個嵌套for循環,將嘗試讀取大小*大小實體。

0

你的問題可能是這一部分:

fp=fopen("file_name", "r"); 

您要使用的變量FILE_NAME代替:

fp=fopen(file_name, "r"); 

使你的程序不容易出錯,您應經常檢查該文件已經成功打開:

fp=fopen("file_name", "r"); 
if (!fp) 
    return -1; 
0

它沒有解決問題,但改爲(a = 0; a < = SIZE; a ++) to for(a = 0; a < SIZE; a ++)

0

您正在打開名爲「file_name」的文件,該文件可能不是從命令行掃描的文件。

爲了解決這個問題刪除就行了引號

fp=fopen("file_name", "r"); 
0

你不需要內部循環,而你從像「〜/ FILE_NAME」讀書,這可能不存在,因此fp將是NULL(你不檢查),所以任何嘗試使用它都會導致崩潰。

+0

這怎麼修復 – user793384 2011-06-10 22:24:18

1

這聽起來像是一個很好的機會,熟悉gdb。既然你在Ubuntu上,它應該默認安裝。

-gdb3編譯程序並將其加載到GDB:它使用r和gdb

gdb -q ./a.out 

運行會告訴你在哪裏發生段錯誤,從該網站使用print語句檢查你的變量。

$ gdb -q a.out 
Reading symbols from /home/user/tmp/SO/bytes/a.out...done. 
(gdb) r 
Starting program: /home/user/tmp/SO/bytes/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x080483a4 in main() at sf.c:7 
7  *p = 2; 
(gdb) print p 
$1 = (int *) 0x0 
+0

你是什麼意思編譯和運行 - gdb3 – user793384 2011-06-10 22:16:36

+0

GDB是一個命令行調試器。調試器是幫助您修復程序並允許您一次運行一行的工具。 – rerun 2011-06-11 01:23:58

1

有許多東西都是在這裏下車,如:

  • 文件名可能是不正確的 - fopen("file_name",...總是會打開一個名爲「filename

  • 您正在創建長度爲50(SIZE)的ID和等級數組 - 以C表示,這意味着數組索引的範圍爲0到49,但您的a和b for循環從0到50。

  • 您沒有對fscanf的輸出進行任何完整性檢查,也沒有檢查是否可以真正打開文件。

我建議讀一下C數組,字符串處理和文件I/O操作 - 有大量的教程可以通過Google找到。

1

首先 這是不正確

fp=fopen("file_name", "r"); 

也許你的意思

fp=fopen(file_name, "r"); 

你這樣做從這個循環不會退出您已經閱讀了大小乘

整數前
for(b = 0; b < SIZE; b++) 
     { 
      fscanf(fp,"%d", &grades); 
      grade[b] = grades; 
     } 

你不必做一個循環:我覺得

fscanf(fp,"%d", &grades); 

取而代之的,是你真正需要的閱讀成績。

記住,總是從的fscanf(測試返回代碼),而fopen()

例子:

if ((fp=fopen(file_name,"r"))==NULL) exit(-9); 
do { 
    if (fscanf(fp,"%d",&(ID[a]))!=1) break; 
    if (fscanf(fp,"%d",&(grade[a]))!=1) break; 
} 
while((grade[a]!=0) && (ID[a++]!=0));