从 C 中的文件读取时出现奇怪的循环
Weird loop while reading from a file in C
我正在用 C 语言编写代码,以从 .txt 文件中读取矩阵(3 <= dim <= 9 的方阵)并按其编写方式打印出来。文件排列如下:
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
老实说,我不知道为什么会这样。我尝试了不同的条件来停止循环,其中机器人 none 成功了。
如果我改变
while (fscanf(arquivo, "%d", &N) != EOF)
进入
while (fscanf(arquivo, "%d", &N) == 1)
输出只是
5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA
本例中第二次循环scanf的值为“0”。
我怎样才能修复它并准确打印文件上写的内容?
顺便说一句,我知道还有其他形式可以准确打印 .txt 的制作方式,我的意思是,我不需要二维数组来执行此操作。但是,我将使用这个程序读取几个矩阵并对它们进行一些测试(我也想打印它们),所以我确实需要将数据存储在字符矩阵中。
问题就在这里
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;
}
}
我正在用 C 语言编写代码,以从 .txt 文件中读取矩阵(3 <= dim <= 9 的方阵)并按其编写方式打印出来。文件排列如下:
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
老实说,我不知道为什么会这样。我尝试了不同的条件来停止循环,其中机器人 none 成功了。
如果我改变
while (fscanf(arquivo, "%d", &N) != EOF)
进入
while (fscanf(arquivo, "%d", &N) == 1)
输出只是
5
AAAAA
AAAAA
AAAAA
AAAAA
AAAAA
本例中第二次循环scanf的值为“0”。 我怎样才能修复它并准确打印文件上写的内容?
顺便说一句,我知道还有其他形式可以准确打印 .txt 的制作方式,我的意思是,我不需要二维数组来执行此操作。但是,我将使用这个程序读取几个矩阵并对它们进行一些测试(我也想打印它们),所以我确实需要将数据存储在字符矩阵中。
问题就在这里
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;
}
}