2016-03-22 14 views
0

次のコードでは、charからcharをファイルから読み込み、各charを2次元配列に格納しようとしています。2次元の配列を出力するC

#include <stdio.h> 
#pragma warning(disable:4996) 
int main(){ 

    char grid[3][5]; 
    FILE *file; 
    file = fopen("input.txt", "r"); 
    int c; 

    if (file == NULL){ 
     perror("Error in reading the file"); 
    } 
    else{ 
     int j=0; 
     for (int i = 0; i < 3; i++) 
     { 
      while (j<5) 
      { 
       grid[i][j] = fgetc(file); 
       j++; 
      } 
      j = 0; 
     } 
    } 

    int length = sizeof grid/sizeof grid[0][0]; 
    for (int i = 0; i < 3; i++) 
    { 
     for (int j = 0; j < 5; j++) 
     { 
      printf("%c %d %d \n", grid[i][j], i, j); 

     } 
    } 
    printf("\n"); 
    return 0; 
} 

のように、私はルックスから読み込まれたファイル:私は結果は以下のようになりたい

ABCDE 
FGHIJ 
KLMNO 

その後、私はその座標(iとj)と、アレイ内の各文字を印刷したいです:

A 0 0 
B 0 1 
... 

しかし、私が得た本当の結果は次のとおりです。

A 0 0 
B 0 1 
C 0 2 
D 0 3 
E 0 4 

1 0 
F 1 1 
G 1 2 
H 1 3 
I 1 4 
J 2 0 

2 1 
K 2 2 
L 2 3 
M 2 4 

ご覧のとおり、2番目の行には最初にスペースが、3番目の行には同じスペースが印刷されます。また、最後の2文字はNとOは印刷されません。誰かがこの問題を解決するのを助けることができますか?コード

for (int i = 0; i < 3; i++) 
{ 
    while (j<5) 
    { 
     grid[i][j] = fgetc(file); 
     j++; 
    } 
    j = 0; 
} 

のこのビットは、それが読み込ま必ず文字を作るためにチェックしますif文に追加するには

+2

'\ n'を2文字読み込み、' char'配列の最後の2つの要素を取り出します。 –

+0

ファイルの内容を 'ABCDEFGHIJKLMNO'に変更してください。正しく動作するはずです。 –

答えて

2

変更は、改行文字\nではありません。完成したコードは次のようになります:

for (int i = 0; i < 3; i++) 
{ 
    while (j<5) 
    { 
     char c = fegetc(file); 
     if(c != '\n') 
     { 
      grid[i][j] = fgetc(file); 
      j++; 
     } 
    } 
    j = 0; 
} 

Fiddling Bitsは、内部ループをforループ(読みやすくするため)に変更することを提案しています。しかし、else文を必要としないのに対して、if文のelse部分にj--を入れなければならないという欠点があります。上記の修正とこの修正を内側のループをforループに変更して表示し、この場合に最も可読性が高いと思われるものを決定することができます。このコードは、最初の問題の変更と修正を表します。

for (int i = 0; i < 3; i++) 
{ 
    for(int j = 0; j < 5; j++) 
    { 
     char c = fegetc(file); 
     if(c != '\n') 
     { 
      grid[i][j] = fgetc(file); 
     } else { 
      j--; 
     } 
    } 
} 
+1

'while'ループの代わりに' for'ループを使用すると、より洗練されたものになります。 –

+0

@FiddlingBits私は同意します。私はそれを表すコードを編集します。アドバイスをいただきありがとうございます。 –

+0

あなたの言葉を変更しましたが、うまくいきませんでした – Nasser

0

別のfgetc(ファイル)を追加しようとします。 j = 0の後に; (割り当てなし)。 ファイルから新しい行の文字を引き出します