科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件实例解析C++/CLI的输入与输出

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

当使用标准C++编程时,我们已开始接触到两个主要的I/O\\\"工具\\\":标准C头文件cstdio和标准C++中与流相关的头文件iostream。

作者:谢启东编译 来源:天极开发 2007年11月14日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
其他类型的I/O

  到目前为止,所有的示例都是处理字符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
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章