为什么我在读取文件时会陷入无限循环?
Why do i end up in an infinite loop when i read a file?
我正在尽我最大的努力来完成这项工作,但它似乎并不想这样做。
前提很简单。我正在尝试使用 fgetc 读取文件并将结果写入数组,在任何 \n 或 EOF 处停止。它按预期读取该行,但没有明显的原因,该行一结束,程序就会陷入无限循环。我尝试使用 fgets、getline 甚至 fscanf(我知道这不是一个好主意,但这确实是我的最后一个)
这是我的 fgetc 尝试:
short ended = 0;
FILE *bRead = fopen(fdirs,"r");
char *dirscan[1024];
char scan;
short endln = 0;
while(ended==0) {
for(int i=0;endln==0 && i<1024;i++) {
if(i==1023) {
dirscan[i]='[=10=]';
endln=1;
} else {
scan = fgetc(bRead);
if(scan == '\n' || scan == EOF) {
dirscan[i]='[=10=]';
endln=1;
} else {
dirscan[i]=scan;
}
}
printf("i= %d, s = %s\n",i,dirscan);
}
if(scan==EOF)
ended=1;
}
fclose(bRead);
我什至试图删除 "if(scan==EOF)" 但程序,看起来它从未真正离开 for 循环,同时甚至 运行 一次又一次的 printf
它读取的文件(编辑:在 运行 这段代码之前创建并且)看起来像这样:
0: .
0: .
并且 printf 在终端上写入:
i= 0, s = 0
i= 1, s = 0:
i= 2, s = 0:
i= 3, s = 0: .
i= 4, s = 0: .
之后既不继续写入也不给终端控制权
在你问之前,是的,我在这个代码下还有其他代码,但我测试了数百次,没有问题
你这里有一些问题。
fgetc
函数 returns 一个 int
,而不是 char
。这样做的原因是 EOF
通常是 -1,这超出了 unsigned char
的范围,后者在正常情况下转换为 int
后返回。
将 scan
更改为 int
以解决此问题。
int scan;
您还错误地声明了 dirscan
:
char *dirscan[1024];
这将创建一个指针数组,而不是一个字符数组。你反而想要:
char dirscan[1024];
然后是死循环的原因。离开 for
循环后,您永远不会重置 endln
。这意味着在 while
循环的后续迭代中,您永远不会进入 for
循环。所以 scan
永远不会改变,这意味着 ended
永远不会改变。
在进入for
循环之前将endln
设为0:
endln = 0;
for(int i=0;endln==0 && i<1024;i++) {
最后,当您在 for
循环结束时打印 dirscan
时,您没有以空字符结尾的字符串,因此您有读取数组末尾的风险。
要么将此 printf
移到循环外部,要么在循环中一次只打印一个字符。
我正在尽我最大的努力来完成这项工作,但它似乎并不想这样做。
前提很简单。我正在尝试使用 fgetc 读取文件并将结果写入数组,在任何 \n 或 EOF 处停止。它按预期读取该行,但没有明显的原因,该行一结束,程序就会陷入无限循环。我尝试使用 fgets、getline 甚至 fscanf(我知道这不是一个好主意,但这确实是我的最后一个)
这是我的 fgetc 尝试:
short ended = 0;
FILE *bRead = fopen(fdirs,"r");
char *dirscan[1024];
char scan;
short endln = 0;
while(ended==0) {
for(int i=0;endln==0 && i<1024;i++) {
if(i==1023) {
dirscan[i]='[=10=]';
endln=1;
} else {
scan = fgetc(bRead);
if(scan == '\n' || scan == EOF) {
dirscan[i]='[=10=]';
endln=1;
} else {
dirscan[i]=scan;
}
}
printf("i= %d, s = %s\n",i,dirscan);
}
if(scan==EOF)
ended=1;
}
fclose(bRead);
我什至试图删除 "if(scan==EOF)" 但程序,看起来它从未真正离开 for 循环,同时甚至 运行 一次又一次的 printf
它读取的文件(编辑:在 运行 这段代码之前创建并且)看起来像这样:
0: .
0: .
并且 printf 在终端上写入:
i= 0, s = 0
i= 1, s = 0:
i= 2, s = 0:
i= 3, s = 0: .
i= 4, s = 0: .
之后既不继续写入也不给终端控制权
在你问之前,是的,我在这个代码下还有其他代码,但我测试了数百次,没有问题
你这里有一些问题。
fgetc
函数 returns 一个 int
,而不是 char
。这样做的原因是 EOF
通常是 -1,这超出了 unsigned char
的范围,后者在正常情况下转换为 int
后返回。
将 scan
更改为 int
以解决此问题。
int scan;
您还错误地声明了 dirscan
:
char *dirscan[1024];
这将创建一个指针数组,而不是一个字符数组。你反而想要:
char dirscan[1024];
然后是死循环的原因。离开 for
循环后,您永远不会重置 endln
。这意味着在 while
循环的后续迭代中,您永远不会进入 for
循环。所以 scan
永远不会改变,这意味着 ended
永远不会改变。
在进入for
循环之前将endln
设为0:
endln = 0;
for(int i=0;endln==0 && i<1024;i++) {
最后,当您在 for
循环结束时打印 dirscan
时,您没有以空字符结尾的字符串,因此您有读取数组末尾的风险。
要么将此 printf
移到循环外部,要么在循环中一次只打印一个字符。