C fseek()超出文件限制,未终止

C fseek()超出文件限制,未终止,c,fseek,C,Fseek,在最后一个while循环中,应打印文件中存储的每5个字符,但循环将无限期地进行,并且不会终止。 函数的feof()在到达文件末尾时应返回1,循环应退出,但循环将无限期地进行 #include<stdio.h> main() { long n, k; char c; FILE *fp; fp = fopen("RANDOM", "w"); while ((c = getchar()) != EOF) { putc(c, fp); } n = f

在最后一个while循环中,应打印文件中存储的每5个字符,但循环将无限期地进行,并且不会终止。 函数的feof()在到达文件末尾时应返回1,循环应退出,但循环将无限期地进行

#include<stdio.h>

main() {
  long n, k;
  char c;
  FILE *fp;
  fp = fopen("RANDOM", "w");

  while ((c = getchar()) != EOF) {
    putc(c, fp);
  }

  n = ftell(fp);
  printf("\nNo. of characters entered by the user is : %ld\n", n);
  fclose(fp);
  fp = fopen("RANDOM", "r");

  while(feof(fp) == 0) {
    n = ftell(fp);
    c = getc(fp);
    printf("The character at %ld position is %c\n", n, c);
    fseek(fp, 4l, 1);
  }
}
#包括
main(){
长n,k;
字符c;
文件*fp;
fp=fopen(“随机”、“w”);
而((c=getchar())!=EOF){
putc(c,fp);
}
n=ftell(fp);
printf(“\n用户输入的字符数为:%ld\n”,n);
fclose(fp);
fp=fopen(“随机”、“r”);
while(feof(fp)==0){
n=ftell(fp);
c=getc(fp);
printf(“位于%ld位置的字符是%c\n”,n,c);
fseek(fp,4l,1);
}
}
来自:

成功调用
fseek()
函数将清除流的文件结束指示符

即使您将位置指示器设置在EOF后面,
fseek()
也会成功。 因此,当
fseek()
是循环中的最后一个命令时,
while(feof(fp)==0)
将永远不会终止

相反,您可以:

for( ;; ) {
    n = ftell(fp);
    if( (c = getc(fp)) == EOF )
         break;
    printf("The character at %ld position is %c\n", n, c);
    fseek(fp, 4l, SEEK_CUR);
}

1.)参见2。)您不必使用第二个
fopen(“RANDON”,“r”)
重新分配
fp
,而是使用
feof()
ftell()。您可能想要
fp=fopen(“随机”、“r”)。完全正确。这将调用未定义的行为。您关闭了
fp
,再次打开该文件,并将结果(可能是有效的
文件*
)泄漏到再也看不到的地方,然后将旧的、仍然关闭的
fp
发送到您的循环中。简短版本:此代码中缺少
fp=
。使用
c=getchar())您试图实现什么目标!=EOF
?请不要重复使用幻数
1
作为
fseek()的第三个参数的错误。唯一正确的值是
SEEK\u SET
SEEK\u CUR
SEEK\u END