实例解析C++/CLI的输入与输出
【IT168技术文档】
当使用标准C++编程时,我们已开始接触到两个主要的I/O"工具":标准C头文件cstdio和标准C++中与流相关的头文件iostream,如果加上Windows的话,那么还有Win32库和MFC库,另外,还有CLI/.NET。本文将要探讨的,就是C++/CLI中的输入与输出。
简介
日常,我们与文件或设备进行通讯的逻辑通道,称为流。数据可以8位字节或16位Unicode字符形式进行读写,而两者都有其自己的类集;另外,还有用于在字节与字符之间转换的类。其中,字符流通过Stream类及其的派生类实现;字符流通过TextReader与TextWriter类及其的派生类实现。
每当一个程序运行时,会自动为我们打开三个流,分别是: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)); } }
0
相关文章