Introduction to Programming with c++ 13-7 BinaryIO

来源:互联网 发布:windows什么系统好用 编辑:程序博客网 时间:2024/06/05 04:20

这一目主要是对BinaryIO的一些基本概念坐下总结。代码虽然不难写,不过这些基本概念倒是值得好好理解理解。

基本概念

Files can be classified into text and binary.

text file and binary file

A file that can be processed(read, created or modified) using a text editor is called a text file.All the files are called binary files. For example, the C++ source code are stored in text files and can be read by a text editor, but the c++ executable files are stored in binary files and are read by the operating sysytems.
(PS:这一段并没有从本质上揭示二者区别,只是给了一个形象的描述。)

more about text file and binary file

You can envision a text file as consisting of a sequence of characters and a bainary file as consisting of a sequence of bits.
(PS:这一段进一步说明了,一个是字节序列,一个是比特序列。)

文章此时举了一个199的例子,如果是存在text file, 那么199是 ‘1’, ‘9’, ‘9’这三个字符。如果是binary file, 就是199在计算机内存中表示。

内存表示如下:用表格代替下,每个表格看做内存中的一个字节。字符用ascii编码的形式存储。那么’1’(49),’9’(57)

  • 199 (text file)
Memory 00110001 00111011 00111011
  • 199(binary file)
Memory 11000111

从内存表示来看,显然binary file具有更高的存储效率。

Note

Computer do not differentiate binary files and text files. All files are stored in binary format, and all files are essentially binary files.Text I/O is built upon binary I/O to provide a level of abstraction for character encoding and decoding.
(PS:这一部分说的非常的精髓,二者本质上都是binary file,只不过text file 在此基础上做了一层抽象,对字符做了编码和解码,从而使得text file变成有结构数据,就和网络通信过程中下层对上层的封装一样。)


回到本章开始的地方,再总结一些基本概念。

stream

C++ uses the term stream to describe a flow of data.If it flows to your programme, the stream is called input stream. If it flows out from your programme, it it called an output stream.
C++ uses objects to read/write a stream of data.For convenience, an input object is called input stream which processing and manipulating input streams , output object is called output stream which processing and manipulating output streams .


代码

BinaryIO不常用,接口如下:

streamObject.write( char* address, int size );streamObject.read( char* address, int size );//这个感觉和c的也比较像,就是从address这个地址,读取size个字节。//对于第二个函数,size是期望读取的字节数,但是实际读取的用函数gcount获得。

下面这部分代码针对string类型的,所以参数传递的时候不牵扯到转换。

#include <iostream>#include <fstream>#include <string>int write_binary_file( const std::string& word );std::string read_binary_file();int main(){    std::string s = "China";    write_binary_file( s );    std::string t = read_binary_file();    std::cout << t << std::endl;    return 0;}int write_binary_file( const std::string& word ){    std::ofstream fout;    fout.open( "input.dat", std::ios::binary );    if( !fout.is_open() )    {        std::cerr << "Can not open the file!" << std::endl;        return -1;    }    fout.write( word.c_str(), word.size() );    fout.close();    return 0;}std::string read_binary_file(){    static const int maxn = 32;    char tmp[maxn];    std::ifstream fin;    fin.open( "input.dat", std::ios::binary );    if( !fin.is_open() )    {        std::cerr << "Can not open the file!" << std::endl;        return NULL;    }    fin.read( tmp, maxn - 1 ); // the last character for '\0'    tmp[fin.gcount()] = '\0';    fin.close();    std::string ret( tmp, tmp + fin.gcount() );    return ret;}

下面补充针对非string类型的代码,以int类型为例。
reinterpret_cast这个关键字之前没有接触过,感觉用在地址强转上。这个后序再总结吧。

int write_binary_file1( int val ){    std::ofstream fout;    fout.open( "input.dat", std::ios::binary );    if( !fout.is_open() )    {        std::cerr << "Can not open the file!" << std::endl;        return -1;    }    fout.write( reinterpret_cast<char*>(&val), sizeof(int) );    fout.close();    return 0;}int read_binary_file1(){    int ret = 0;    std::ifstream fin;    fin.open( "input.dat", std::ios::binary );    if( !fin.is_open() )    {        std::cerr << "Can not open the file!" << std::endl;        return -1;    }    fin.read( reinterpret_cast<char*>(&ret) , sizeof(int) );     return ret;}
0 0
原创粉丝点击