user-0 提问: 什么情况下会产生文件结尾符？

回复:
user: user-1
content: 一般情况下，文件内容里面不会有EOF字符。 读文件函数只有在遇到实际文件末尾时，才返回EOF 我这里举'\x1a'字符被文本模式打开时被认为已经到了文件末尾的例子，只是说明Windows为兼容过去的约定，可以识别而已。

user: user-0
content: 引用 17 楼 zhao4zhong1 的回复:一般情况下，文件内容里面不会有EOF字符。 读文件函数只有在遇到实际文件末尾时，才返回EOF 我这里举'\x1a'字符被文本模式打开时被认为已经到了文件末尾的例子，只是说明Windows为兼容过去的约定，可以识别而已。  谢谢赵老师的回复！

user: user-0
content: 引用 15 楼 qq_37824129 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] #include <stdio.h> FILE *f; int c,n; int main() {     f=fopen("test.txt","wb");     fputc('A',f);     fputc('\x1a',f);     fputc('B',f);     fclose(f);     f=fopen("test.txt","r");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     f=fopen("test.txt","rb");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     return 0; } //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,ff,YES //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,1a,NO //n,c,hex,EOF:2,B,42,NO //n,c,hex,EOF:3,,ff,YES //  文本文件，文件模式下‘\x1a’是文本结尾符，那在二进制模式下，文件结尾符又是什么呢？同样是文本文件，为什么会有中文本结尾符？感谢赵老师能在白忙之中抽空解答我的问题，初学者，不是很明白，望详解。[/quote] 为什么会有 2 种文件结尾符

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:#include <stdio.h> FILE *f; int c,n; int main() {     f=fopen("test.txt","wb");     fputc('A',f);     fputc('\x1a',f);     fputc('B',f);     fclose(f);     f=fopen("test.txt","r");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     f=fopen("test.txt","rb");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     return 0; } //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,ff,YES //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,1a,NO //n,c,hex,EOF:2,B,42,NO //n,c,hex,EOF:3,,ff,YES //  文本文件，文件模式下‘\x1a’是文本结尾符，那在二进制模式下，文件结尾符又是什么呢？同样是文本文件，为什么会有中文本结尾符？感谢赵老师能在白忙之中抽空解答我的问题，初学者，不是很明白，望详解。

user: user-2
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 lin5161678 的回复:] 强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符 不排除有人就往文本文件最后写一个'\x1a'  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 [/quote] 太长没看  看了第一句  我就简单回复一下  有人就往文本文件最后写一个'\x1a' 那这个 '\x1a' 也不是文件结束符呀  这是文件的内容

user: user-1
content: 引用 3 楼 lin5161678 的回复:强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符 不排除有人就往文本文件最后写一个'\x1a'  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符

user: user-3
content: 文件结尾符是文件末尾的标识，只要这个文件存在应该就会有

user: user-4
content: 任何情况下都有个文件结尾符

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:#include <stdio.h> FILE *f; int c,n; int main() {     f=fopen("test.txt","wb");     fputc('A',f);     fputc('\x1a',f);     fputc('B',f);     fclose(f);     f=fopen("test.txt","r");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     f=fopen("test.txt","rb");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     return 0; } //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,ff,YES //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,1a,NO //n,c,hex,EOF:2,B,42,NO //n,c,hex,EOF:3,,ff,YES //  感谢赵老师的回复，谢谢！

user: user-1
content: #include <stdio.h> FILE *f; int c,n; int main() {     f=fopen("test.txt","wb");     fputc('A',f);     fputc('\x1a',f);     fputc('B',f);     fclose(f);     f=fopen("test.txt","r");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     f=fopen("test.txt","rb");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     return 0; } //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,ff,YES //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,1a,NO //n,c,hex,EOF:2,B,42,NO //n,c,hex,EOF:3,,ff,YES //

user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  #include <stdio.h> FILE *f; int c,n; int main() {     f=fopen("test.txt","wb");     fputc('A',f);     fputc('\x1a',f);     fputc('B',f);     fclose(f);     f=fopen("test.txt","r");     n=0;     while (1) {         c=fgetc(f);         printf("n,c,hex,EOF:%d,%c,%02x,%s\n",n,c,(unsigned char)c,(feof(f)?"YES":"NO"));         n++;         if (feof(f)) break;     }     fclose(f);     return 0; } //n,c,hex,EOF:0,A,41,NO //n,c,hex,EOF:1,,ff,YES //

user: user-4
content: 引用 10 楼 zhao4zhong1 的回复:[quote=引用 9 楼 jack960330 的回复:] 赵老师的意思是 有时候会被误认为EOF 但现在不会了，一般操作系统有自己的判断，不会误认为是EOF的 在Windows下，用“r"模式fopen打开一个中间有'\x1a'字符的文本文件，实际编译链接调试一下，看看会不会被”误认“为EOF。 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！ [/quote] 很久之前的win可能会有 现在不会了，因为EOF操作系统的实现上，根本不是一个字符，而是一组字符，再加上磁盘有文件长度记录，操作系统都有自己的判断

user: user-1
content: 引用 9 楼 jack960330 的回复:赵老师的意思是 有时候会被误认为EOF 但现在不会了，一般操作系统有自己的判断，不会误认为是EOF的 在Windows下，用“r"模式fopen打开一个中间有'\x1a'字符的文本文件，实际编译链接调试一下，看看会不会被”误认“为EOF。 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-4
content: 赵老师的意思是 有时候会被误认为EOF 但现在不会了，一般操作系统有自己的判断，不会误认为是EOF的

user: user-0
content: 引用 7 楼 qq_37824129 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] [quote=引用 3 楼 lin5161678 的回复:] 强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符 不排除有人就往文本文件最后写一个'\x1a'  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 [/quote] 文本模式和二进制模式？[/quote] 额。。。没明白

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 lin5161678 的回复:] 强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符 不排除有人就往文本文件最后写一个'\x1a'  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 [/quote] 文本模式和二进制模式？

user: user-0
content: 引用 3 楼 lin5161678 的回复:强调一下  文件结束符是 函数返回值  不是文件内部有一个文件结束符 额，初学者，还抱着C Primer Plus 在啃，能详细讲解下不，十分感谢！