在第11章的编程和原则中,作者给出了以下代码来演示二进制:
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
#include<sstream>
#include <fstream>
#include <iomanip>
using namespace std;
template<class T>
char* as_bytes(T& i) // treat a T as a sequence of bytes
{
void* addr = &i; // get the address of the first byte
// of memory used to store the object
return static_cast<char*>(addr); // treat that memory as bytes
}
int main()
{
// open an istream for binary input from a file:
cout << "Please enter input file name\n";
string iname;
cin >> iname;
ifstream ifs {iname,ios_base::binary}; // note: stream mode
// binary tells the stream not to try anything clever with the bytes
// open an ostream for binary output to a file:
cout << "Please enter output file name\n";
string oname;
cin >> oname;
ofstream ofs {oname,ios_base::binary}; // note: stream mode
// binary tells the stream not to try anything clever with the bytes
vector<int> v;
// read from binary file:
for(int x; ifs.read(as_bytes(x),sizeof(int)); ) // note: reading bytes
v.push_back(x);
// . . . do something with v . . .
// write to binary file:
for(int x : v)
ofs.write(as_bytes(x),sizeof(int)); // note: writing bytes
return 0;
}
我有一些问题:
为什么他要读取一个未初始化变量的地址? 为什么程序在文件末尾切断了一些字符? 为什么以及如何将未初始化的变量推送到向量中?
问题1和问题3 在……里面
for(int x; ifs.read(as_bytes(x),sizeof(int)); )
x传递给未初始化的函数,但是x未定义的值将不被使用。
这个read函数将使用分配给x作为一个容器。它会读一个int数据的价值ifs并储存在x施予x一个已知的值,然后可以安全地使用。因为循环的主体将不会进入,除非int从文件中读取
v.push_back(x);
的有效值。x...假设输入文件包含有效的intS.
问题2 ifs正在以块的形式读取int尺寸。如果文件的大小不能被int决赛read都会失败。只有在read成功,因此不会向向量中添加任何数据,也不会从vector并写入输出文件。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。