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)
- 199(binary file)
从内存表示来看,显然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;}
- Introduction to Programming with c++ 13-7 BinaryIO
- Introduction to Programming in C/C with Vim
- Introduction to programming with OpenCV
- Introduction to programming with OpenCV
- Introduction to programming with OpenCV
- Introduction to programming with OpenCV
- Introduction to Programming in C/C++ with Vim
- Introduction to Programming in C/C++ with Vim
- Introduction to Programming with c++ 13-5 File Open Modes
- Introduction to Programming with c++ 13-7 eof的置位时机
- Introduction to Concurrent Programming with Stackless Python
- An Introduction to Network Programming with Java
- Introduction to Game Programming with C++
- Introduction to Sound Programming with ALSA
- Introduction to Sound Programming with ALSA
- Introduction to Sound Programming with ALSA
- Introduction to programming with Sun/ONC RPC
- Introduction to Programming with C++ Comprehension Version
- 在服务器GPU73上编译安装Caffe
- 8.9 反射和泛型
- 【Linux命令行与shell脚本编程】教程三——切换目录
- 参数服务器——分布式机器学习的新杀器
- org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned b
- Introduction to Programming with c++ 13-7 BinaryIO
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- Java Math的中floor,round,ceil的用法
- Introduction to TitanEngine
- Nginx (深度好文)
- 算法 最优服务次序问题
- 拉格朗日乘子法和KKT条件
- linux三种网络连接方式的区别
- OpenWRT使用iptables设置只允许MAC地址对应设备访问局域网