2016-03-22 30 views
0

Aşağıdaki kodda, char'i char'dan bir dosyadan okumaya çalışıyorum ve her bir karakter dizisini iki boyutlu bir dizide saklıyorum.C iki boyuttan oluşan bir dizi yazdırma

#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; 
} 

ben gibi görünüyor okunan dosya:

ABCDE 
FGHIJ 
KLMNO 

İstediğim gibi olmak için sonuç Bundan sonra ben onun koordinatlar, (i ve j) ile dizideki her kömürü yazdırmak istediğiniz :

A 0 0 
B 0 1 
... 

Ama var gerçek sonuçları geçerli:

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 

Gördüğünüz gibi, ikinci satır bir boşluk ile ilk ve üçüncü sırayla aynı şekilde basılır. Ayrıca, son iki harf N ve O yazdırılmaz. Birisi bu sorunu çözmeme yardımcı olabilir mi? kod

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

bu biraz daha okumak emin karakteri olmak için kontrol edecek bir ise açıklamada eklemek için

+2

İki karakterden oluşan karakterleri okuyorsunuz. Bu karakter, 'char' dizininizin son iki öğesini dışarıya itiyor. –

+0

Dosyanızın içeriğini 'ABCDEFGHIJKLMNO' olarak değiştirin ve düzgün çalışmalıdır. –

cevap

2

Değişim bir satır karakteri \n değildir. Bitmiş kod aşağıdaki gibi görünecektir:

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 Uçları

iç döngü (okunabilirlik için) döngü için değiştirilebilir önerdi. Buna katılıyorum, ancak if ifadesinin başka bir kısmına j--'u koymanın dezavantajı var, hatta başka bir ifadeye bile gerek yok. Yukarıdaki düzeltmeyi ve bu düzeltmeyi iç döngü ile bir for döngüsünde değiştirebilir ve hangisinin en iyi okunabilirliğe sahip olduğuna karar verebilirsiniz. Bu kod bu değişikliği hem de ilk sorun için düzeltme temsil eder: Başka fgetc (dosya) eklemek için

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' döngüsünü yerine' for' döngüsünü kullanmak da temizler. –

+0

@FiddlingBits Katılıyorum. Bunu temsil etmek için kodu düzenleyeceğim. Tavsiye için teşekkürler. –

+0

Bahsettiğinizi değiştirdim ama çalışmadı – Nasser

0

deneyin; j = 0'dan sonra; (Herhangi bir atama olmadan). Yeni satır char dosyasını dosyanızdan çekecektir

İlgili konular