2013-04-05 56 views
0
int main() 
{ 
    char a[100][100]; 
    int i = 0, k = 0; 
    FILE* file = fopen("A:/input.txt", "r"); 
    if(file == NULL){ 
     perror("Error opening file !\n"); 
    } else { 
     while(! feof(file)){ 
      fscanf(file, "%d;%s\n", &i, a[i]); 
     } 
    } 
    for(; k < i; ++k){ 
     printf("%d -> %s\n", k, a[k]); 
    } 
    return 0; 
} 

我有這個代碼的工作片,我試圖實現它作爲這樣一個功能:如何從文件函數中進行工作讀取?

int reader(char b[20], char *a[100][100], int *i){ 
    int j = 0; 
    FILE* file = fopen(b, "r"); 
    if(file == NULL){ 
     perror("Error opening file !\n"); 
    } else { 
     while(! feof(file)){ 
      fscanf(file, "%d;%s\n", j, a[j]); 
     } 
    } 
*i = j; 
return 0;} 

,並從主的電話:

char a[100][100]; 
int i = 0; 
reader("Type.txt", &a, &i); 

但是當我使用函數,代碼在fscanf調用時崩潰。 任何ideea我如何使這項工作或如何創建一個函數,從文件中逐行讀取並創建一個數組在這種形式:array [0] = firstline,array [1] = secondline等

+2

這裏有無數的問題。 'reader()'接口中的'char * a [100] [100]'可能不是您想要的或意思;那麼你沒有正確使用它。該設計只能讀取最多100行,並且只有每行少於100個字符。 'while(!feof(file))'符號是Pascal編程的一個(糟糕!)解酒;這是不好的C代碼,永遠。你不檢查'fscanf()'的返回值。你不會在掃描循環中增加'j',所以你一直覆蓋同一行。你不關閉在'reader()'中打開的文件。在'main()'中,你不會在循環中增加'i'。 – 2013-04-05 16:39:22

+0

在我正在閱讀數據的文件是存儲這樣的ID;名稱,這就是爲什麼我不增加我因爲我直接從文件讀取它,我讀取ID並將名稱放入數組[id]。 – CristiDeac 2013-04-05 20:24:14

+0

你不能那樣做。在調用'scanf()'之前確定'''用於索引'array'的值。然後你用讀取更新'j'。下一個輸入進入前一個輸入的索引讀取。我確實在想,這是不是你想要的,但我想「不,不可能,可以嗎?」你從編譯器得到了多少警告?你應該從'reader()'函數中得到一些(我得到兩個:'格式'%d'需要'int *'類型的參數,但參數3的類型'int'和'格式'%s'預計類型'char *'的參數,但參數4的類型爲'char **')。 – 2013-04-05 21:15:22

回答

1

你在main()函數中用變量i正確地做了它,但是當你將它移動到某個函數時,你忘記了一個符號。你需要的j地址傳遞給fscanf()

fscanf(file, "%d;%s\n", &j, a[j]); 
1

首先,你必須在&添加到j在這一行

fscanf(file, "%d;%s\n", j, a[j]); 

應該

fscanf(file, "%d;%s\n", &j, a[j]); 

也輸入函數數組不應該包含星號*

int reader(char b[20], char a[100][100], int *i){ 
+0

謝謝,最好的解決方案!如果我只添加&在j嘗試將數據放在4個字節中,並在字符串a中的4個位置寫入一個條目,所以刪除*是必要的。 再次感謝! – CristiDeac 2013-04-05 20:27:24