为什么当我读取一个文件时,我最终会陷入一个无限循环?

问题描述 投票:0回答:1

我很努力地想让它工作,但它似乎不想工作。

前提很简单,我想用fgetc读取一个文件,然后把结果写到一个数组中,在任何一个IOF或IOF上停止。我试着用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]='\0';
            endln=1;
        }   else {
            scan = fgetc(bRead);
            if(scan == '\n' || scan == EOF) {
                dirscan[i]='\0';
                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。

它读取的文件(Edit:是在运行这段代码之前创建的,)是这样的。

0: .
0: .

然后printf在终端上写入这个文件:

i= 0, s = 0
i= 1, s = 0:
i= 2, s = 0: 
i= 3, s = 0: .
i= 4, s = 0: .

既不继续写,也不给终端控制权。

在你问之前,是的,我在这个代码下有其他代码,但我测试了几百次,它没有任何问题。

c loops file infinite-loop
1个回答
2
投票

你这里有几个问题。

你这里有几个问题。fgetc 函数返回一个 int,不是 char. 原因是 EOF 通常是-1,不属于一个的范围。unsigned char 铸造后返回到一个 int 在正常情况下,。

改变 scan 到一个 int 来解决这个问题。

int scan;

你还声明 dirscan 不正确。

char *dirscan[1024];

这将创建一个指针数组,而不是一个字符数组。 而是要。

char dirscan[1024];

那就是无限循环的原因 你从不重置 endln 出境后 for 循环。 这意味着,在以后的 while 循环,你永远不会进入 for 循环。 所以 scan 不变 ended 永不改变。

设置 endln 变成0,然后再进入 for 循环。

endln = 0;
for(int i=0;endln==0 && i<1024;i++) {

最后,当你打印的时候 dirscan 到头来 for 循环,你没有一个以null结束的字符串,所以你有可能读过数组的末端。

要么将这个 printf 到循环的外面,或者在循环中一次只打印一个字符。

© www.soinside.com 2019 - 2024. All rights reserved.