| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 637 人关注过本帖
标题:求大神详解关于 EOF 和‘\032 ’和文件结尾的问题
只看楼主 加入收藏
hutianlun
Rank: 2
等 级:论坛游民
帖 子:21
专家分:13
注 册:2013-3-28
结帖率:100%
收藏
已结贴  问题点数:35 回复次数:1 
求大神详解关于 EOF 和‘\032 ’和文件结尾的问题
Ctrl+Z是一个字符,在ASCLL字符集里为十进制26位,
疑问1:ASCLL中'26'不就是Ctrl+Z,那他到底是不是文件结尾?如果是文件结尾,那EOF是什么,EOF不是也是文件结尾吗?如果他们同属于文件结尾,那字符Ctrl+Z其实值也为-1??  在<stdio.h>中 关于EOF的定义#define EOF     (-1)
在C Primer Plus P366面有这样一段话,“很多MS-DOS编辑器使用字符CTRL+Z标识文本文件的结尾,如果以文本模式打开这样的文件,C可以认出这个字符是标识文件结尾的字符。可是如果以二进制模式打开这样的文件,只会把Ctrl+Z当作文件中的一个字符。
疑问2:为什么我使用下面的代码并以"r"作为fopen的读取方式时检测不到‘26’,并且以"rb"但是以读取方式时还是检测不到‘26’。 但EOF作为循环条件时检测会成功,
既然二进制模式把Ctrl+Z当作文件中的一个字符,为什么用循环却检测不到Ctrl+Z?

程序代码:
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
  FILE *fp;
  char ch;

 if ((fp=fopen("1.txt","rb"))==NULL)
    printf("hehe");

while( (ch=getc(fp))!='\032' )
{ 

      putc(ch,stdout);

 }
  return 0;
}
文本.rar (442 Bytes)
代码中的1.txt就在压缩包中,环境win7 32位


[ 本帖最后由 hutianlun 于 2014-5-26 20:44 编辑 ]
搜索更多相关主题的帖子: 文本文件 二进制 编辑器 十进制 
2014-05-26 20:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:35 
把什麽東西認作什麽東西,是具體環境決定的。在Windows和DOS體系,亦即微軟的慣例,操作系統把Ctrl+Z的鍵盤掃描碼解釋爲整數26,而C/C++庫在這種系統實現的具體代碼,在流輸入函數體系(確切地說是控制臺的標準輸入流)中,把這個數據解釋爲遇到EOF,EOF(-1)是流輸入函數在遇到Ctrl+Z這個數據時硬砌出來主動返回的,不是讀入的。在微軟的體系是如此,在Unix/Linux的體系,則不是Ctrl+Z。

記住:EOF是無法通過輸入手段輸入的!

[ 本帖最后由 TonyDeng 于 2014-5-26 21:42 编辑 ]

授人以渔,不授人以鱼。
2014-05-26 21:40
快速回复:求大神详解关于 EOF 和‘\032 ’和文件结尾的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027645 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved