user-0 提问: 对文件操作的一个小疑问！

回复:
user: user-1
content: 果然如此，多谢楼上指正

user: user-2
content: 楼主确定file1.dat只有14个字符吗？ 我做一个file1.dat文件后，显示大小为15个字符，说明结尾有个EOF字符。 EOF字符的整数值为-1,所以在用char来显示时会是个奇怪的图形（ASCII码，不要忘记，规定的是0～127的对应字符，-1没有对应字符）

user: user-0
content: EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 那EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。 引用 1 楼 zhao4zhong1 的回复: 引用 4 楼 u010882724 的回复: 引用 5 楼 zjq9931 的回复:

user: user-3
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-4
content: 如果文件中存在一个字节是0xff，那么用下面的程序，iIn接收fgetc的返回值，和用cIn接收fgetc输出的结果是不同的。 用iIn接收，可以读取完整的文件，用cIn接收，只能读取到文件中的0xff处。  #include<stdio.h> int main() { 	FILE *pflIn; 	char cIn; 	int iIn; 	pflIn = fopen("f:\\b.txt", "rb"); 	if(pflIn == NULL) 	{ 		puts("sdfsdfds"); 		return 0; 	} 	cIn = fgetc(pflIn); 	while (cIn!=EOF) 	{ 		printf("%d\n", cIn); 		cIn = fgetc(pflIn); 	} 	printf("%d\n", EOF); 	return 0; }  引用 8 楼 u013491662 的回复:EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 那EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:] 引用 4 楼 u010882724 的回复: 引用 5 楼 zjq9931 的回复:[/quote]  引用 8 楼 u013491662 的回复:EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 那EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:] 引用 4 楼 u010882724 的回复: 引用 5 楼 zjq9931 的回复:[/quote]

user: user-5
content: while (!feof(in))     {         ch = fgetc(in);         fputc(ch, out);         putchar(ch);     }  当读出最后一个字节时，feof(in)   == 0, 接着又进入while    ch = fgetc(in);之后， feof(in)   != 0了， 之后便该跳出循环了。     for(;;)     {         ch = fgetc(in);         if(feof(in))         {            break;         }         fputc(ch, out);         putchar(ch);     }

user: user-4
content: 注意如果用EOF判断，因为EOF是-1,而不是用feof()这个函数来判断，那么，接收fgetc函数返回值的必须是int型，不能是char型。因为文件中可能存在char型的-1，如果是文件中的-1字符（0xff）,用char型的接收，就后有问题了。int型的-1是0xffffffff 引用 8 楼 u013491662 的回复:EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 那EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:] 引用 4 楼 u010882724 的回复: 引用 5 楼 zjq9931 的回复:[/quote]

user: user-6
content: 引用 1 楼 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;  //... } 类似的例子还可以举很多。

user: user-4
content: EOF是，文件读取函数的返回值。并没有在文件里面存着。是文件读取函数根据系统的文件结构来的。 引用 8 楼 u013491662 的回复:EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 那EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。 [quote=引用 1 楼 zhao4zhong1 的回复:] 引用 4 楼 u010882724 的回复: 引用 5 楼 zjq9931 的回复:[/quote]

user: user-3
content: 引用 17 楼 taiyang_1435586562 的回复:在对文件操作时，我也遇到过这样的问题，我是这样解决的： ch=fgetc(in); putchar(ch); fputc(ch,out); while(!feof(fp)) 	{	ch=fgetc(in);                 putchar(ch);                 fputc(ch,out); 	} 这段代码操作长度为0的文件时会出问题。

user: user-1
content: 在对文件操作时，我也遇到过这样的问题，我是这样解决的： ch=fgetc(in); putchar(ch); fputc(ch,out); while(!feof(fp)) 	{	ch=fgetc(in);                 putchar(ch);                 fputc(ch,out); 	}

user: user-0
content: 引用 9 楼 endeavourken 的回复:楼主确定file1.dat只有14个字符吗？ 我做一个file1.dat文件后，显示大小为15个字符，说明结尾有个EOF字符。 EOF字符的整数值为-1,所以在用char来显示时会是个奇怪的图形（ASCII码，不要忘记，规定的是0～127的对应字符，-1没有对应字符）

user: user-0
content: 引用 2 楼 user-8 的回复:        听说feof()就是有这个问题，读到-1后不立即结束，还要多读一次.....那个符号就是 -1 吧，你调试下看看你while(!feof(in))里面是不是执行了15次 EOF是文本文件的结束标志 可是我的file1.dat文件里并没有EOF啊？  computer and c  总共14个字符，文件只有14个字节？ 哪EOF在哪里呢？ 程序是怎么找到EOF的呢？这个有点不明白，百科搜EOF也没有答案。。。

user: user-4
content: 引用 楼主 u013491662 的回复:两个文件分别是 file1.dat file2.dat file1.dat里面的内容是 一共14个字符 file1.dat这个文件占14个字节 我的疑问是 为什么file2.dat占15个字节，内容里最后还有个字符，好像是空格，也好想是全角空格，又或者是别的！  读写文件的过程改成这样就可以了。  ch = fgetc(in); while (!feof(in))     {         fputc(ch, out);         putchar(ch);         ch = fgetc(in);//读取之后判断，是否文件结束，如果是结束，就不用写出了。     }

user: user-7
content: 楼主可以去看一下百科的解释，里面详细说明了这个问题的原因、、、 http://baike.baidu.com/link?url=caxKNmCIhaGoPS-74dO4_GOIiTO74I_rDvSUdJv1luF0SjZCjNabyJqd0F2dBT1a

user: user-3
content: 在没进行任何读操作之前是不可能feof的。

user: user-8
content: 听说feof()就是有这个问题，读到-1后不立即结束，还要多读一次.....那个符号就是 -1 吧，你调试下看看你while(!feof(in))里面是不是执行了15次

user: user-3
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;  //... } 类似的例子还可以举很多。