c++ - 文本文件的二进制输入
问题描述
编程原理与实践在第 11 章中说:“在内存中,我们可以将数字 123 表示为整数值(每个 int 占 4 个字节)或字符串值(每个字符占 1 个字节)”。
在读取二进制文本文件时,我试图了解内存中存储的内容。所以我正在写向量 v 的内容。
如果输入文件包含以下文本:“test these words”
输出文件显示这些数字: 1953719668 1701344288 1998611827 1935962735 168626701 168626701 168626701 168626701 168626701 168626701 168626701
我尝试将“测试”的每个字符转换为二进制,我有 01110100 01100101 01100101 01110100,如果我将其视为 4 个字节的整数并将其转换为十进制,我得到 1952802164,这仍然与输出不同。
这是如何正确完成的,所以我可以理解发生了什么?谢谢!
#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()
{
string iname{"11.9_in.txt"};
ifstream ifs {iname,ios_base::binary}; // note: stream mode
string oname{"11.9_out.txt"};
ofstream ofs {oname,ios_base::binary}; // note: stream mode
vector<int> v;
// read from binary file:
for(int x; ifs.read(as_bytes(x),sizeof(int)); ) // note: reading bytes
v.push_back(x);
for(int x : v)
ofs << x << ' ';
}
解决方案
假设您使用的是 little-endian 机器(例如 x86)和 ASCII 兼容的字符代码(例如 Shift_JIS 和 UTF-8)。
test
表示74 65 73 74
为二进制数据。
使用little-endian,多字节整数的更高字节被放置到更高地址。
因此,将它们读取为 4 字节整数,它将被解释为0x74736574
十进制1953719668
。
推荐阅读
- c# - C# 在 Enumerable.All 扩展中使用带有 return bool 的异步 lambda 表达式
- docker - 如何在 dockerized 环境中使用 webdriverio 测试节点应用程序 (ERR_SSL_PROTOCOL_ERROR)
- scala - 在 scala 数据框中操作数据表连接
- powershell - 将同一文件复制到多个目的地
- c# - 在我的 .NET c# 应用程序上实现 Postek 打印机
- react-native - react-native-image-slider-box 与图像上方的 dotStyle 滑块不起作用
- laravel - 如何在 Laravel 8 中使用 jetstream-inertia 安装 Vuetify?
- node.js - 如何在rabbitmq(rascal.js)上管理每个请求的发布连接
- javascript - 在纯 JavaScript 中将一个存储单元转换为另一个
- ruby-on-rails - ruby gem 问题未初始化常量