user-0 提问: 关于文件复制的问题，非常疑惑，附代码。

回复:
user: user-1
content: feof Tests for end-of-file on a stream.  int feof( FILE *stream );  Function Required Header Compatibility  feof <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.  Parameter  stream  Pointer to FILE structure  Remarks  The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been reached. When end of file is reached, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.  Example  /* FEOF.C: This program uses feof to indicate when  * it reaches the end of the file FEOF.C. It also  * checks for errors with ferror.  */  #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  count, total = 0;    char buffer[100];    FILE *stream;     if( (stream = fopen( "feof.c", "r" )) == NULL )       exit( 1 );     /* Cycle until end of file reached: */    while( !feof( stream ) )    {       /* Attempt to read in 10 bytes: */       count = fread( buffer, sizeof( char ), 100, stream );       if( ferror( stream ) )      {          perror( "Read error" );          break;       }        /* Total up actual bytes read */       total += count;    }    printf( "Number of bytes read = %d\n", total );    fclose( stream ); }   Output  Number of bytes read = 745   Error Handling Routines |  Stream I/O Routines  See Also   clearerr, _eof, ferror, perror

user: user-1
content: feof只有在fgetc之后才会为真。

user: user-0
content: 此贴结贴，答案看三楼解释。谢谢。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。   确实是这样，大神真是牛啊，可能就是最后一次已经判定了feof(in)结束了，但是由于后面还有一句fputc(ch,out)这一句也执行了，所以如果在之前加一个if判定条件，那就可以避免这种情况发生。谢谢。

user: user-0
content: 引用 2 楼 u012421456 的回复:我这儿没问题，楼主什么编译器 要不从新新建文件再试试？ VC++6.0

user: user-2
content: 按3楼的改法，多出来的乱码不见了，太感谢了～

user: user-2
content: 帮顶，gdb打进去，看到多一次循环，不知道为什么。陪楼主一起等大神解答～  附带以前记的关于EOF的两条我自己不理解的笔记。 1.从缓冲区读取文件内容时，缓冲区中文件的末尾会添加EOF标志，这个EOF标志只会出现在缓冲区内，而不会出现在硬盘的文件中。 2.文件位置指针指向末尾的EOF是feof返回真的充分必要条件。

user: user-3
content: #include<stdio.h>  void main()  {  FILE *in,*out; // char ch; int ch;  in=fopen("hong.txt","r");  out=fopen("hong1.txt","w");  if(in==NULL)  printf("open in Fail");  if(out==NULL)  printf("open out Fail");  //while(!feof(in)) for(;;)  {  ch=fgetc(in);  if(eof(in)) break;  fputc(ch,out);  }  fclose(in);  fclose(out);  printf("Finish");  }

user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-4
content: 我这儿没问题，楼主什么编译器 要不从新新建文件再试试？

user: user-5
content: ch=fgetc(in); 	while(!feof(in)) 	{ 		fputc(ch,out); 		ch=fgetc(in); 	} 在循环外先读一下，在内部先写文件，再读才可以。结束边界没处理好。