【问题标题】:Weird loop while reading from a file in C从C中的文件读取时出现奇怪的循环
【发布时间】:2018-11-14 02:58:04
【问题描述】:

我正在用 C 语言编写代码以从 .txt 文件中读取矩阵(具有 3

5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA
6
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX
XXXXXX

第一个数字表示后续矩阵的大小。

我写了以下代码:

int main () {
    FILE *arquivo;
    char A[9][9];
    int N;
    int i,j;
    char temp;
    arquivo = fopen("matrizes.txt", "r");
    if (!arquivo) printf("Erro.\n");
    while (fscanf(arquivo, "%d", &N) != EOF) {   
        printf("%d \n", N);
        fgetc(arquivo);
        for (i = 0; ((i < N) && (temp = fgetc(arquivo)) != '\n') ; i++) {
            for (j = 0; j < N; j++) {
                A[i][j] = temp;
            }
        }
        for (i = 0; i < N; i++) {
            for(j = 0; j<N; j++) {
                printf("%c", A[i][j]);
            }
            puts(" ");
        }
    }
    return 0;
}

输出是这样的

5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
5 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
AAAAA 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
6 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 
XXXXXX 

我真的不知道为什么会这样。我尝试了不同的条件来停止循环,但他们都没有成功。

如果我改变了

while (fscanf(arquivo, "%d", &N) != EOF)

进入

while (fscanf(arquivo, "%d", &N) == 1)

输出只是

5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA

本例中第二个循环scanf的值为“0”。 如何修复它并准确打印文件上的内容?

顺便说一句,我知道还有其他形式可以准确地打印 .txt 文件的制作方式,我的意思是,我不需要二维数组来执行此操作。但是,我将使用这个程序读取几个矩阵并用它们做一些测试(我也想打印它们),所以我真的需要将数据存储在字符矩阵中。

【问题讨论】:

    标签: c loops fgetc


    【解决方案1】:

    问题就在这里。

       for (i = 0; ((i < N) && (temp = fgetc(arquivo)) != '\n') ; i++) {
            for (j = 0; j < N; j++) {
                A[i][j] = temp;
            }
        }
    

    一旦看到换行符,循环将退出并再次启动while 循环。

    相反,您想读取 N 行。

        for (i = 0; i < N; i++) {
            for(j = 0; (temp = fgetc(arquivo)) != '\n'; j++ ) {
                A[i][j] = temp;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 1970-01-01
      相关资源
      最近更新 更多