我很努力地想让它工作,但它似乎不想工作。
前提很简单,我想用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: .
既不继续写,也不给终端控制权。
在你问之前,是的,我在这个代码下有其他代码,但我测试了几百次,它没有任何问题。
你这里有几个问题。
你这里有几个问题。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
到循环的外面,或者在循环中一次只打印一个字符。