C语言生手,卡在一个无限循环了
C语言新手,卡在一个无限循环了
我运行这段代码的结果在循环上是正常的,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 1:");
fseek(fp,0L,SEEK_SET);
while(fgets(line,80,fp) && line != NULL)
fputs(line,stdout);
if(line == NULL)
puts("null!");
return 0;
}

然后当我把循环体改成这样子后就会无限循环,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 2:");
fseek(fp,0L,SEEK_SET);
fgets(line,80,fp);
while(line != NULL){
fputs(line,stdout);
fgets(line,80,fp);
}
return 0;
}

一直想不通这两种循环体不是应该一样的么?其中是什么样的机理导致呢?
但是如果改成逐个字符读入就没问题,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 3:");
fseek(fp,0L,SEEK_SET);
ch = getc(fp);
while(ch != EOF){
putchar(ch);
ch = getc(fp);
}
return 0;
}
还有在第一段代码最后
if(line == NULL)
puts("null!");
运行后没有打印“null!”,也就是说此时line不是空指针,但是不是空指针它又为何能跳出循环?如果line在读取到文件尾后是指向未知地址的野指针,那么它当时是怎么判断文件尾的?野指针怎么能通过line!=NULL的判断?
恳请大神解答,如果以上问题有涉及到非常白痴的基础知识,请不要见怪
------解决思路----------------------
line是数组首地址,数组的地址怎么会是0呢,所以line != NULL这句永远为真
也就是说,第一个程序中:
这句话真正起作用的只有第一个表达式,当读到文件尾时fgets返回0,才是while退出的原因
我运行这段代码的结果在循环上是正常的,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 1:");
fseek(fp,0L,SEEK_SET);
while(fgets(line,80,fp) && line != NULL)
fputs(line,stdout);
if(line == NULL)
puts("null!");
return 0;
}
然后当我把循环体改成这样子后就会无限循环,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 2:");
fseek(fp,0L,SEEK_SET);
fgets(line,80,fp);
while(line != NULL){
fputs(line,stdout);
fgets(line,80,fp);
}
return 0;
}
一直想不通这两种循环体不是应该一样的么?其中是什么样的机理导致呢?
但是如果改成逐个字符读入就没问题,
#include <stdio.h>
int main(void)
{
FILE *fp;
char ch,line[80];
fp = fopen("test.txt","r");
puts("Test 3:");
fseek(fp,0L,SEEK_SET);
ch = getc(fp);
while(ch != EOF){
putchar(ch);
ch = getc(fp);
}
return 0;
}
还有在第一段代码最后
if(line == NULL)
puts("null!");
运行后没有打印“null!”,也就是说此时line不是空指针,但是不是空指针它又为何能跳出循环?如果line在读取到文件尾后是指向未知地址的野指针,那么它当时是怎么判断文件尾的?野指针怎么能通过line!=NULL的判断?
恳请大神解答,如果以上问题有涉及到非常白痴的基础知识,请不要见怪
------解决思路----------------------
line是数组首地址,数组的地址怎么会是0呢,所以line != NULL这句永远为真
也就是说,第一个程序中:
while(fgets(line,80,fp) && line != NULL)
//等价于while(fgets(line,80,fp) )
这句话真正起作用的只有第一个表达式,当读到文件尾时fgets返回0,才是while退出的原因