
实例解析C++/CLI的输入与输出
发布时间:2006-08-21 10:53:44 来源:天极开发 网友评论 0 条
其他类型的I/O
到目前为止,所有的示例都是处理字符I/O,当然,这对大多数程序来说,已是足够了;但在某些程序中,却需要以二进制形式处理不同的数据类型,请看例4中的代码:
例4:
一个BinaryWriter对象必须与某种形式的输出流相关联,因此,在标记1中,我们打开了一个磁盘文件,并在标记2中把文件流与BinaryWriter相关联。而标记4与5中的情况也是一样的。
标记3及后续的语句,调用了几个Write函数,同样地,在标记6中也有相应的Read函数。程序输出见插3。
代码段3:例4的输出
随机访问I/O
在随机访问中,可以打开一个文件,并在同一时间,用读写流访问它,或在文件中移动读写位置、保存当前位置以便返回、重新读取一个文件区域、或进行覆写,请看例5:
例5:
在标记3中,显示了当前文件位置,并在标记4中,通过FileStream::Position属性把它保存在一个变量中。如果设置了相同的属性值,就可以恢复当前位置,如标记5与6所示。在此可以保存任意数量的位置值。
还可以通过调用FileStream::Seek来确定文件的当前位置,如标记7、8、9中所示;此函数的第一个参数是一个与第二个参数指定位置相关的字节计数。
举例来说,在标记7中,我们指定了从文件起始处的0字节偏移;在标记8中,我们指定了当前位置之前的1字节偏移--这也正位于我们读取的布尔变量之前;在标记9中,指定了文件结尾前的8字节位置,并读取此处的double变量。一般而言,最好设置Position为一个先前从属性中获取的值;另外,定位至文件的起始与结尾都是安全的,然而,定位至一个任意的字节位置也许会让我们正巧位于一个多字节值当中,那么之后进行的读取将是毫无意义的,程序的输出请见插4。
插4:例5的输出
到目前为止,所有的示例都是处理字符I/O,当然,这对大多数程序来说,已是足够了;但在某些程序中,却需要以二进制形式处理不同的数据类型,请看例4中的代码:
例4:
| using namespace System; using namespace System::IO; int main() { /*1*/ Stream^ fs = File::Create("io04.dat"); /*2*/ BinaryWriter^ bw = gcnew BinaryWriter(fs); /*3*/ bw->Write(true); bw->Write(L'A'); bw->Write(0xabcd); bw->Write(0x12345678LL); bw->Write(123.456F); bw->Write("Hello"); bw->Close(); fs->Close(); /*4*/ fs = File::Open("io04.dat", FileMode::Open); /*5*/ BinaryReader^ br = gcnew BinaryReader(fs); /*6*/ Console::WriteLine("bool: " + br->ReadBoolean()); Console::WriteLine("wchar_t: " + br->ReadChar()); Console::WriteLine("int: " + br->ReadInt32()); Console::WriteLine("long long: " + br->ReadInt64()); Console::WriteLine("float: " + br->ReadSingle()); Console::WriteLine("String: " + br->ReadString()); br->Close(); fs->Close(); } |
一个BinaryWriter对象必须与某种形式的输出流相关联,因此,在标记1中,我们打开了一个磁盘文件,并在标记2中把文件流与BinaryWriter相关联。而标记4与5中的情况也是一样的。
标记3及后续的语句,调用了几个Write函数,同样地,在标记6中也有相应的Read函数。程序输出见插3。
代码段3:例4的输出
| bool: True wchar_t: A int: 43981 long long: 305419896 float: 123.456 String: Hello |
随机访问I/O
在随机访问中,可以打开一个文件,并在同一时间,用读写流访问它,或在文件中移动读写位置、保存当前位置以便返回、重新读取一个文件区域、或进行覆写,请看例5:
例5:
| using namespace System; using namespace System::IO; int main() { /*1*/ Stream^ fs = gcnew FileStream("Io05.dat", FileMode::Create, FileAccess::ReadWrite); BinaryWriter^ bw = gcnew BinaryWriter(fs); BinaryReader^ br = gcnew BinaryReader(fs); /*2*/ Console::WriteLine("CanRead is {0}, CanWrite is {1}, CanSeek is {2}", fs->CanRead, fs->CanWrite, fs->CanSeek); /*3*/ Console::WriteLine("Position at start is {0}", fs->Position); bw->Write(true); /*4*/ long long pos1 = fs->Position; bw->Write(1234); bw->Write(123.456); Console::WriteLine("Position at end is {0}", fs->Position); /*5*/ fs->Position = pos1; bw->Write(5678); //把1234覆写为5678 /*6*/ fs->Position = 0; bw->Write(false); //把true覆写为false /*7*/ fs->Seek(0, SeekOrigin::Begin); Console::WriteLine("bool: " + br->ReadBoolean()); /*8*/ fs->Seek(-1, SeekOrigin::Current); Console::WriteLine("bool: " + br->ReadBoolean()); Console::WriteLine("int: " + br->ReadInt32()); /*9*/ fs->Seek(-8, SeekOrigin::End); Console::WriteLine("double: " + br->ReadDouble()); bw->Close(); br->Close(); fs->Close(); } |
在标记3中,显示了当前文件位置,并在标记4中,通过FileStream::Position属性把它保存在一个变量中。如果设置了相同的属性值,就可以恢复当前位置,如标记5与6所示。在此可以保存任意数量的位置值。
还可以通过调用FileStream::Seek来确定文件的当前位置,如标记7、8、9中所示;此函数的第一个参数是一个与第二个参数指定位置相关的字节计数。
举例来说,在标记7中,我们指定了从文件起始处的0字节偏移;在标记8中,我们指定了当前位置之前的1字节偏移--这也正位于我们读取的布尔变量之前;在标记9中,指定了文件结尾前的8字节位置,并读取此处的double变量。一般而言,最好设置Position为一个先前从属性中获取的值;另外,定位至文件的起始与结尾都是安全的,然而,定位至一个任意的字节位置也许会让我们正巧位于一个多字节值当中,那么之后进行的读取将是毫无意义的,程序的输出请见插4。
插4:例5的输出
| CanRead is True, CanWrite is True, CanSeek is True Position at start is 0 Position at end is 13 boolean: False boolean: False int: 5678 double: 123.456 |
推荐阅讯
- Visual C++ 入门精解-WINDOWS应用程序设计
- C/C++语言void及void指针深层探索
- 给MSN Messager装个钩子
- C++:最强大的.NET语言之可访问性
- c++友元的入门教程
- VC编程中如何操作数据库中的图像字段
- Winsocket编程之TCP/IP体系结构
- Windows Socket1.1 程序设计
- 新手入门:C/C++中的结构体
- C++箴言:拷贝一个对象的所有组成部分
阅读排行
- 1.Borland 发布C++ Builder 2006 RAD 环境
- 2.C/C++程序员应聘常见面试题深入剖析
- 3.Visual C++常用数据类型转换详解
- 4.C++中的 static 关键字
- 5.利用VC++实现局域网实时视频传输
- 6.浅谈C/C++内存泄漏及其检测工具
- 7.英国投票否决C++/CLI 微软强攻ISO标准受挫
- 8.VC++下用MSComm控件实现串口通讯
- 9.伪随机数生成及在VC++中的实现
- 10.VC++编程实现对波形数据的频谱分析
专题教程
- 大话G游 专题:手机病毒揭密
- ARP攻击防范与解决方案 路由故障处理手册
- Picasa中文版_Picasa教程 专题:清除流氓软件
- Firefox专题 seo搜索引擎优化专区
- 重装Windows必知的事情 装机之必备软件大行动
病毒专杀栏
