注册通行证 用户名 密码
  • 文章投稿
  • 博客
  • 论坛
  • 设为首页
  • 加入收藏
jztop.com网络技术
  • 首页
  • | iT新闻
  • | 操作系统
  • | 组网建网
  • | 网络安全
  • | 程序开发
  • | 办公一族
  • | 工具软件
  • | 网页制作
  • | 多媒体制作
  • | 网吧技术
  • | 服务器
  • | 专题教程
Vista | 软件评测 | 系统备份 | 优化 | 进程 | 聊天 | 病毒 | Linux | 黑客 | 防火墙 | 数据库 | Web开发 | Java | Word | 游戏 | 32位开发 | 移动开发
当前位置:首页 > 程序开发 > 32位开发 > C/C++ > 内容正文

实例解析C++/CLI的输入与输出

发布时间:2006-08-21 10:53:44 来源:天极开发 网友评论 0 条
  当使用标准C++编程时,我们已开始接触到两个主要的I/O"工具":标准C头文件cstdio和标准C++中与流相关的头文件iostream,如果加上Windows的话,那么还有Win32库和MFC库,另外,还有CLI/.NET。本文将要探讨的,就是C++/CLI中的输入与输出。

  简介

  日常,我们与文件或设备进行通讯的逻辑通道,称为流。数据可以8位字节或16位Unicode字符形式进行读写,而两者都有其自己的类集;另外,还有用于在字节与字符之间转换的类。其中,字符流通过Stream类及其的派生类实现;字符流通过TextReader与TextWriter类及其的派生类实现。

  在图1中演示了标准I/O的类继承关系。(带有System命名空间前缀的类与I/O无关,但其却是I/O类的基类。)

  图1:标准I/O类继承关系

  System::Object
   System::Attribute
    System::ComponentModel::MemberAttribute
     System::ComponentModel::DescriptionAttribute
      IODescriptionAttribute
   System::ComponentModel::Component
    FileSystemWatcher
   System::Delegate
    FileSystemEventHandler
     RenamedEventHandler
   System::EventArgs
    FileSystemEventArgs
    RenamedEventArgs
   System::Exception
    IOException
     DirectoryNotFoundException
     EndOfStreamException
     FileNotFoundException
    PathTooLongException
    System::SystemException
    InternalBufferOverflowException
   BinaryReader
   BinaryWriter
   FileSystemEntry
    Directory
    File
   Stream
    BufferedStream
    FileStream
    MemoryStream
   TextReader
    StreamReader
    StringReader
   TextWriter
    StreamWriter
    StringWriter
   System::ValueType
    System::Enum
     ChangedFilters
     FileAccess
     FileMode
     FileShare
     FileSystemAttributes
     SeekOrigin
     WatcherChangeTypes
     WatcherTarget
   WaitForChangedResult

  每当一个程序运行时,会自动为我们打开三个流,分别是:

  ·标准输入:一般来说,其被定向到键盘(可以使用Console::SetIn来进行重定向);可通过其类型为TextReader的Console::In字段来访问。

  ·标准输出:一般来说,其被定向到屏幕(可以使用Console::SetOut来进行重定向);可通过其类型为TextWriter的Console::Out的字段来访问。标准输出一般用于结果的显示。

  ·标准错误:一般来说,其被定向到屏幕(可以使用Console::SetError来进行重定向);可通过其类型为TextWriter的Console::Error字段来访问。标准错误一般用于错误信息的显示。

  在标准流中,可支持多种单字节与多字节字符编码,例如,在大量的日文计算中,或许不会存储为Unicode,但可使用占据一个或多个字节的多种编码形式来存储,如JIS、Shift-JIS、EUC;同样地,在使用字母的"西方国家"中,大量的文本使用EBCDIC编码来存储,而使用UTF-8格式也在日渐增多。字符流隐藏了处理这些编码的复杂性,它们中的某些类可允许指定某种特定的编码形式。对字符编码的详细讨论已经超过了本文的范围,可参阅其他书籍。

  基本I/O类

  我们就从TextReader与TextWriter类开始,这两个类提供了一些基本的原语,而所有其他的字符流I/O都是在其上构建的,在例1中演示了这些原语:

  例1:

using namespace System;
/*1*/ using namespace System::IO;

void Copy(TextReader^ inStream, TextWriter^ outStream);

int main()
{
 /*2*/ TextReader^ inStream = Console::In;
 /*3*/ TextWriter^ outStream = Console::Out;

 /*4*/ outStream->Write(static_cast<wchar_t>(inStream->Read()));
 outStream->Write(static_cast<wchar_t>(inStream->Read()));
 /*5*/ outStream->Flush();

 array<wchar_t>^ buffer = {L'w', L'x', L'y', L'z'};
 /*6*/ inStream->Read(buffer, 1, 2);
 /*7*/ outStream->Write(buffer);

 /*8*/ Copy(inStream, outStream);

 /*9*/ outStream->Write("{0} * {1} = {2}/n", 10, 5, 10 * 5);
 /*10*/ inStream->Close();
 /*11*/ outStream->Close();
}

/*12*/
void Copy(TextReader^ inStream, TextWriter^ outStream)
{
 /*13*/ int c;

 while ((c = inStream->Read()) != -1)
 {
  outStream->Write(static_cast<wchar_t>(c));
 }
}

  在标记1中,我们通过引入命名空间System::IO,以使用标准I/O;在标记2与3中,定义了两个变量:inStream与outStream,分别引用标准输入与输出流。

  在标记4中,读入一个字符,并直接回写,接着再读写另一个。请留意写操作中的显示转换,这是因为Read返回一个int而不是wchar_t。

  输出流支持缓冲区刷新--即转储清除,如标记5所示。

  正如大家在标记6中所看到的,Read方法被重载了,我们之前使用的第一个版本读取并返回一个宽字符,而这个新版本读取一串给定数目的宽字符,并把它们以给定的偏移量,存储在一个宽字符CLI数组中。在此,我们读取了两个字符,并把它们存储在buffer[1]与buffer[2]中,而buffer[0]与buffer[3]未动。

  在标记7中,我们使用了一个重载版本的Write输出整个数组。

  在标记8中,调用了Copy把输入中的字符逐个复制到输出中,直至文件结尾。紧接着,在标记9中,用了另一个重载版本的Write以进行格式化的输出,最后,在标记10与11中,关闭了两个流。

  可在标记13中看到,我们读取的字符存储在一个int类型的变量中,而这样做的原因是,我们需要返回一个代表了合法字符值的值,如文件结尾。通过返回一个int,Read可以返回-1作为文件结尾的值,而在此的Unicode输入值可为范围0-65535中的任意值。

  代码段1列出了一些输入及与其对应的输出。数字1与数字2被读写出来,接着数字3与数字4被读取并存储在4字符数组的第二个与第三个元素中。在输出数组时,其包含了w、3、4、z;复制读取内容,把余下的字符输出直至文件结尾。最后,格式化输出一行文本。

  代码段:输入与对应的输出

1234567
12w34z567
Hello there
Hello there
^Z
10 * 5 = 50
<end-of-file>


1 2 3 下一页
关于 实例解析C++/CLI的输入与输出 的新闻
    无相关信息
【评论】【收藏本文】【打印】【关闭】
上一篇文章:用Viusal C++实现字符串分割函数
下一篇文章:More Effective C++:类型转换
讨论区
查看
已有 0 位对此新闻感兴趣的网友发表了看法
匿名发表
注册通行证 登陆
图文阅读推荐
全站资源
  • 微软官方入门教程19:轻松掌握Vista系统的快
  • 微软2008大冲击,预借Vista SP1力促Vista市
  • 在收件箱中获得 Windows Vista 的最新更新
  • 微软官方Vista入门教程全集19篇(Vista学院
  • Windows Vista 的成功将势不可挡
  • 快快抛弃Vista,拥抱XP SP3!你觉得呢?
  • 浅谈Vista系统关闭虚拟内存与使用内存盘加速
  • 嘿嘿,按下键盘上面的三个键,马上让你的Vi
  • Windows Vista的盗版率只有Windows XP的一半
  • 3DMark和PCMark Vantage新版将只支持Vista系
阅读排行
  • Borland 发布C++ Builder 2006 RAD 环境
  • C/C++程序员应聘常见面试题深入剖析
  • Visual C++常用数据类型转换详解
  • C++中的 static 关键字
  • 利用VC++实现局域网实时视频传输
  • 浅谈C/C++内存泄漏及其检测工具
  • 英国投票否决C++/CLI 微软强攻ISO标准受挫
  • VC++下用MSComm控件实现串口通讯
  • 伪随机数生成及在VC++中的实现
  • VC++编程实现对波形数据的频谱分析
最新技术文档
  • C++中用赋值形式op=取代单独形式op
  • C++启蒙之用C++制作程序
  • C++启蒙之C++中的类
  • 解析C++/CLI之头文件、内联函数与数组
  • C++启蒙之控制结构
  • C++启蒙之注释符号
  • 了解C++异常处理的系统开支
  • C++语言学习之从结构到类
  • C++中理解“传递参数”和异常之间的差异
  • C++中禁止异常信息传递到析构函数外
专题教程
  • 大话G游 专题:手机病毒揭密
  • ARP攻击防范与解决方案 路由故障处理手册
  • Picasa中文版_Picasa教程 专题:清除流氓软件
  • Firefox专题 seo搜索引擎优化专区
  • 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
  • 杀毒软件反被病毒杀 连"救命"都不能喊
  • 金山ARP防火墙
  • 还原卡神话破灭“机器狗”病毒来势汹汹
  • cctv经济半小时:你的手机现在安全吗?
  • 新挂马方式开始流行 ARP挂马称雄局域网
  • 木马和病毒清除的通用解法
  • IP地址不再冲突 查找ARP攻击者元凶
  • 教你几招识别和防御Web网页木马
  • 分析:封杀BT只是暂时的止痛药
  • QQ爆危险漏洞,“QQ游戏邀请大盗”邀请你玩病
关于我们 | 诚聘英才 | 联系我们 | 版权声明 | 网站大事 | 网站地图 | 意见建议
CopyRight 2005-2007 Jztop.Com 版权所有 未经许可 请勿转载