为什么我在读取文件时会陷入无限循环?

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 移到循环外部,要么在循环中一次只打印一个字符。