2016-03-22 150 views
0

在下面的代码中,我试图从文件中读取char字符并将每个char存储在二维数组中。从那以后,我要打印的每个字符与它的坐标为(i和j)在数组中: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 

我想要的结果是象:

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 

正如您所看到的,第二行首先打印一个空格,第三行打印。另外,最后两个字母N和O不打印。有人可以帮我解决这个问题吗?

+2

您正在读取两个'\ n'作为字符,它将'char'数组的最后两个元素推出。 –

+0

将您文件的内容更改为“ABCDEFGHIJKLMNO”,并且它应该正常工作。 –

回答

2

变化的代码

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

此位在if语句将检查以确保其读入字符添加不是一个换行符\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; 
} 

嘟嘟声位表明内部循环更改为for循环(为了便于阅读)。我同意,但是它的缺点是必须将j--放在if语句的else部分,而不是甚至不需要else语句。您可以查看上述修复程序,并将此修复程序的内部循环更改为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

使用'for'循环而不是'while'循环会更清洁。 –

+0

@FiddlingBits我同意。我将编辑代码来表示该代码。感谢您的建议。 –

+0

我改变了你提到但没有用的东西 – Nasser

0

尝试添加另一个fgetc(文件);在j = 0之后; (没有任何分配)。 它会从您的文件中拉出新的行字符