Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我在读取文件时会进入无限循环?_C_Loops_File_Infinite Loop - Fatal编程技术网

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

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

我正在尽我最大的努力使这项工作,但它只是似乎不想

前提很简单。我正在尝试使用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]='\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只是为了测试目的,将尽快删除