2017-10-17 17 views
1

J'ai un fichier appelé input1.txt, qui est une matrice de chiffres et de lettres.J'essaie de lire et de le stocker dans un tableau 2D de sorte que chaque charte soit de 1 cellule. Voici mon fichier texte:Lecture d'un fichier dans un tableau 2D

1111S11110 
0000010001 
110100010d 
t001111110 
0100000001 
0111111101 
1111111101 
00000D01T1 
0111110001 
0000E01110 

Et voici mon code:

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


// Function for finding the array length 
int numOfLines(FILE *const mazeFile){ 
    int c, count; 
    count = 0; 
    for(;;){ 
     c = fgetc(mazeFile); 
     if(c == EOF || c == '\n') 
      break; 
     ++count; 
    } 
    return count; 
} 

// Main Function 
int main(int argc, char **argv) 
{ 
    // Opening the Matrix File 
    FILE *mazeFile; 
    mazeFile = fopen("input1.txt", "r"); 
    if(mazeFile == NULL) 
     return 1; 
    int matrixSize = numOfLines(mazeFile); 

    // Reading text file into 2D array 
    int i,j; 
    char mazeArray [matrixSize][matrixSize]; 

    for(i=0;i<matrixSize;i++){ 
      for(j=0;j<matrixSize;j++){ 
       fscanf(mazeFile,"%c", &mazeArray[i][j]); 
      } 
    } 

    for(i=0;i<matrixSize;i++){ 
     for(j=0;j<matrixSize;j++){ 
      printf("%c",mazeArray[i][j]); 
     } 
    } 

    fclose(mazeFile); 
    return 0; 
} 

Cependant ma sortie de la console est comme ça quand je les imprimer:

0000010001 
110100010d 
t001111110 
0100000001 
0111111101 
1111111101 
00000D01T1 
0111110001 
[email protected] 

On peut dire qu'elle ne lit pas la 1ère ligne, Cependant en termes d'index, je pense que c'est ok.Je suis nouveau à C.Could n'importe qui s'il vous plaît aider.Merci à l'avance.

+1

votre 'numOfLines' est un abus de langage, il compte le nombre de caractères dans la première ligne. Et donc, les lit! Pourquoi pensez-vous que si vous continuez à lire, vous recommencez depuis le début? la magie? Essayez ['rewind()'] (https://linux.die.net/man/3/rewind). –

+1

Votre fonction 'numOfLines()' lit le fichier jusqu'à la fin. Si vous voulez le relire, vous devez revenir au début (ce qui est possible pour les fichiers ordinaires, mais pas pour d'autres types de flux possibles). –

+1

@JohnBollinger il ** ne lit pas ** à la fin, ce qui ajoute à la confusion dans ce code ... –

Répondre

1

Il y a plusieurs problèmes ici:

La fonction numOfLines est erroné. Voici la version corrigée; il compte en fait le nombre de lignes et réinitialise le pointeur de fichier au début du fichier. Votre version ne comptait que le nombre de caractères dans la première ligne (qui se trouve être 10, et donc la valeur semblait corrigée), et elle n'a pas réinitialisé le pointeur de fichier au début du fichier (donc la première ligne manquait dans votre sortie).

int numOfLines(FILE *mazeFile) { // no const here BTW !! 
    int c, count; 
    count = 0; 
    for (;;) { 
    c = fgetc(mazeFile); 
    if (c == EOF) 
     break;   // enf of file => we quit 

    if (c == '\n') 
     ++count;  // end of line => increment line counter 
    } 
    rewind(mazeFile); 

    return count+1; 
} 

Ensuite, vous avez oublié de le caractère \n d'absorbe à la fin de chaque ligne. Ce \n est à la fin de chaque ligne de votre fichier, mais vous devez le lire, même si vous ne voulez pas le stocker dans votre tableau 2d.

for (i = 0; i<matrixSize; i++) { 
    for (j = 0; j<matrixSize; j++) { 
     fscanf(mazeFile, "%c", &mazeArray[i][j]); 
    } 

    char eol;       // dummy variable 
    fscanf(mazeFile, "%c", &eol);  // read \n character 
    } 

Et enfin vous avez besoin d'imprimer la \n pour la raison mentionnée ci-dessus.

for (i = 0; i<matrixSize; i++) { 
    for (j = 0; j<matrixSize; j++) { 
    printf("%c", mazeArray[i][j]); 
    } 

    putc('\n', stdout);     // print \n 
} 
+0

Merci de m'avoir aidé à voir mes erreurs :), C'est très gentil de votre part. –

+1

@HabilGanbarli vous êtes les bienvenus. Pour des questions claires, vous obtenez presque toujours une réponse rapide et claire ici. –