C 为什么我在读取文件时会进入无限循环?
我正在尽我最大的努力使这项工作,但它只是似乎不想 前提很简单。我正在尝试使用fgetc读取文件并将结果写入数组,在任意\n或EOF处停止。它按照预期读取该行,但没有明显的原因,只要该行结束,程序就会陷入无限循环。我试着使用fgets、getline甚至fscanf(我知道这不是一个好主意,但这确实是我最后一次尝试) 这是我的fgetc尝试:C 为什么我在读取文件时会进入无限循环?,c,loops,file,infinite-loop,C,Loops,File,Infinite Loop,我正在尽我最大的努力使这项工作,但它只是似乎不想 前提很简单。我正在尝试使用fgetc读取文件并将结果写入数组,在任意\n或EOF处停止。它按照预期读取该行,但没有明显的原因,只要该行结束,程序就会陷入无限循环。我试着使用fgets、getline甚至fscanf(我知道这不是一个好主意,但这确实是我最后一次尝试) 这是我的fgetc尝试: short ended = 0; FILE *bRead = fopen(fdirs,"r"); char *dirscan[1024]; char sca
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);
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,这超出了正常情况下转换为int
后返回的无符号字符的范围
将scan
更改为int
以修复此问题
int scan;
您还错误地声明了dirscan
:
char *dirscan[1024];
这将创建指针数组,而不是字符数组。相反,您希望:
char dirscan[1024];
然后是无限循环的原因。离开for
循环后,您永远不会重置endln
。这意味着在while
循环的后续迭代中,您永远不会输入for
循环。因此,scan
永不更改,这意味着结束
永不更改
在进入for
循环之前,将endln
设置为0:
endln = 0;
for(int i=0;endln==0 && i<1024;i++) {
endln=0;
对于(inti=0;endln==0&&i,这里有一些问题
fgetc
函数返回的是int
,而不是char
。原因是EOF
通常为-1,这超出了正常情况下转换为int
后返回的无符号char
的范围
将scan
更改为int
以修复此问题
int scan;
您还错误地声明了dirscan
:
char *dirscan[1024];
这将创建指针数组,而不是字符数组。您希望:
char dirscan[1024];
然后是无限循环的原因。在离开for
循环后,您永远不会重置endln
。这意味着在while
循环的后续迭代中,您永远不会进入for
循环。因此scan
永远不会更改,这意味着end
永远不会更改
在进入for
循环之前,将endln
设置为0:
endln = 0;
for(int i=0;endln==0 && i<1024;i++) {
endln=0;
对于(int i=0;endln==0&&ii如果您想知道为什么数组被称为“dirscan”,那是因为该文件将包含指向方向的路径列表。首先检查fopen
是否成功。如果该文件不存在(经常发生),您认为会发生什么情况?我之所以不检查文件是否存在,是因为它是在运行此代码之前创建和编写的。如果您想知道为什么数组被称为“dirscan”,应该指定它这是因为该文件将包含指向目录的路径列表。首先检查fopen
是否成功。如果该文件不存在(经常发生),您认为会发生什么情况?我之所以不检查文件是否存在,是因为它是在运行此代码之前创建和编写的。我应该指定它谢谢你,我完全是瞎了。我可能对其他函数做了一些同样愚蠢的事情,但现在检查已经太晚了。printf只是为了测试目的,将被删除谢谢,我完全瞎了。我可能对其他函数做了同样愚蠢的事情,但现在检查已经太迟了。printf只是为了测试目的,将尽快删除