2017-10-17 168 views
1

我有一个名为input1.txt的文件,它是一个数字和一些字母的矩阵。我试图读取并将其存储在二维数组中,以便每个章程都是1个单元格。这是我的文本文件:C将文件读入二维数组

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

这里是我的代码:

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

但是我的控制台输出就是这样,当我打印出来:

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

看来它不读第一行,但在索引方面,我认为它是好的。我是新来的C.请任何人请帮助。提前感谢。

+1

您的'numOfLines'是一个用词不当,它计数第一行中的字符数。因此,读它们!你为什么认为如果你继续阅读,你会从头开始重新开始?魔法?试试['rewind()'](https://linux.die.net/man/3/rewind)。 –

+1

您的'numOfLines()'函数将文件读取到最后。如果你想重新阅读它,你需要回到开始(这可以用于普通文件,但不适用于其他可能的流类型)。 –

+1

@JohnBollinger它**不会**读到最后,这增加了这个代码的混乱...... –

回答

1

这里有几个问题:

numOfLines功能是错误的。这是更正后的版本;它实际上会计算行数并将文件指针重置为文件的开头。

您的版本只计算第一行中的字符数(恰好为10,因此该值似乎正确),并且它没有将文件指针重置为文件开头(因此第一行在输出中丢失)。

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

然后你忘记吸收\n字符在每行的末尾。该\n位于文件每行的末尾,但即使您不想将其存储在二维数组中,也需要阅读该文件。

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 
    } 

最后你需要打印\n由于上述原因。

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

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

感谢您帮助我看到我的错误:),那真是太好了。 –

+1

@HabilGanbarli不客气。对于明确的问题,您几乎总能得到一个快速而明确的答案。 –