2017-03-01 59 views
-1

這是一個基本問題,但我似乎對我的代碼有點麻煩。我試圖從文本文件中讀取並將完全相同的數字打印到控制檯。 進入seg故障,有人能把我推向正確的方向嗎?將文件讀入C中的二維數組

基本上我想在屏幕上打印完全相同的數字(不包括'4')。

/* 
My text file simply says the following: 

4 //number of rows 
1 3 5 7 
3 5 7 1 
5 7 1 3 
7 1 3 5 
*/ 

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

int main(){ 

FILE *fptr = fopen("key.txt", "r"); 
int inputs,i,j; 
int matrix[5]; 
fscanf(fptr, "%d", &inputs); 
for(i=0; i<inputs; i++){ 
    for(j=0; j<4; j++){ 
     fscanf(fptr, "%d", &matrix[j]); 
     printf("%d ", matrix[j]); 
     printf("\n"); 
    } 
} 



return 0; 
} 
+0

文本文件是否只有數字和空格,或者它是否也有註釋?在任何情況下,檢查函數返回值以確保它們成功('fptr'非空,'fscanf()'表示指定了一個字段,等等)。 – Dmitri

+1

檢查'fopen'的返回值。 –

+0

實際上,只有數量和空格 –

回答

0

的問題,你原來的代碼是INT矩陣[5]

根據您的示例文本文件,您正在讀取5個以上的值。 最基本的問題是聲明一個足夠大的數組來保存您將要讀取的值的數量。如何確定這取決於您。

根據您的示例文本文件,請考慮下面的內容。

/* 
My text file simply says the following: 

4 
1 3 5 7 
3 5 7 1 
5 7 1 3 
7 1 3 5 
*/ 

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

#define NCOL 4 
#define MAX_ROWS 10 

int main (void) 
{ 
    FILE *fptr; 
    int number_rows; 
    int i, j; 
    int matrix[MAX_ROWS][NCOL]; 

    fptr = fopen("key.txt", "r"); 
    if (fptr == NULL) 
    { 
     printf("Error: failed to open file key.txt\n\n"); 
    } 
    else 
    { 
     fscanf(fptr, "%d", &number_rows); 
     if (number_rows <= 0) 
     { 
      printf("Error: value read for number of rows is %d\n\n", number_rows); 
     } 
     else if (number_rows > MAX_ROWS) 
     { 
      printf("Error: value entered for number rows > MAX_ROWS\n\n"); 
     } 
     else 
     { 
      for (i = 0; i < number_rows; i++) 
      { 
      for (j = 0; j < NCOL; j++) 
      { 
       fscanf(fptr, "%d", &matrix[i][j]); 
      } 
      } 
     } 
     fclose(fptr); 
    } 

    /* if the above failed because key.txt could not be read, 
     then we will be printing out bogus numbers below. 
    */ 

    for (i = 0; i < number_rows; i++) 
    { 
     for (j = 0; j < NCOL; j++) 
     { 
      printf("%d ", matrix[i][j]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
0

您需要在內循環中打印一個空格,在外循環中打印一個換行符以獲得與文件格式相同的輸出。

for(i=0; i<inputs; i++){ 
    for(j=0; j<4; j++){ 
     fscanf(fptr, "%d", &matrix[j]); 
     printf("%d ", matrix[j]); 
     printf(" "); 
    } 
    printf("\n"); 
} 

編輯:我只是一個IDE跑這和它工作正常,並打印在屏幕上的正是你表現出你的文件的方式。如果您遇到分段錯誤,您的實際文件內容與您向我們顯示的內容有所不同。請顯示您的key.txt文件的實際內容。

+0

問題在於程序存在分段錯誤,而不是輸出格式不正確。 –

+0

它沒有。我只是在IDE中運行它,它運行良好。 – VHS

+0

對於提問者而言,它存在段錯誤。正如卡爾諾魯姆所說,我懷疑問題在於fopen()對他們來說是失敗的。 –

0

幾件事情:

1)我覺得你的代碼只能導致片段錯誤如果key.txt不會在當前目錄中(或key.txt不包含上述示例數據)。所以請確保該文件存在正確的內容。

2)嘗試防守編程,這意味着:檢查您是否實際打開文件並獲得有效的FILE *

FILE *fptr = fopen("key.txt", "r"); 
if (fptr == NULL){ 
    fprintf(stderr, "Error, could not open the file!"); 
    return -1; 
} 

3)如果你要定義一個矩陣,你需要一個二維數組

int matrix[5][5]; 

// and in the loop you use 
fscanf(fptr, "%d", &matrix[i][j]);