C++std::ofstream-移动put指针
C++ std::ofstream - Move the put pointer
我正在向文件中写入一些数据。有时,我想从内存中写入一块数据,然后将put指针沿1、2或3个字节移动,以保持4个字节的数据边界格式。
我可以制作一个包含零的新数据块并写下它,但这似乎是不必要的,而且很笨拙。如何将put指针沿1、2或3个字节移动?
我不知道该怎么做,因为如果我调用seekp()
,我肯定会把指针移到当前文件大小之外吗?而我认为ofstream.write()
正确地处理了这个问题?写数据时不知怎么调整了文件的大小?
我假设您正在做类似的事情,只是您不想写两个字节的数据,而是想写4个带有填充的字节。
#include <fstream>
using namespace std;
struct data
{
char first;
char second;
};
int _tmain(int argc, _TCHAR* argv[])
{
ofstream outFile;
data data1;
data data2;
data1.first = 'a';
data1.second = 'b';
data2.first = 'c';
data2.second = 'd';
outFile.open("somefile.dat");
outFile.write(reinterpret_cast<char*>(&data1), sizeof(data));
outFile.write(reinterpret_cast<char*>(&data2), sizeof(data));
outFile.close();
return 0;
}
一种选择是简单地将结构设置为4个字节。这可能有一个缺点,因为它可能会增加内存占用。
使用seekp可能不是一个好的选择,我试过了,它有点奏效,但不是真的。
outFile.write(reinterpret_cast<char*>(&data1), sizeof(data));
outFile.seekp(2, ios_base::cur);
outFile.write(reinterpret_cast<char*>(&data2), sizeof(data));
outFile.seekp(2, ios_base::cur);
这确实成功地在data1之后添加了填充,但没有在data2之后添加。将指针移过just不是一个好主意,因为它不会改变文件大小。我尝试在seekp之后写入0字节,但这也不起作用。
老实说,我会实现一个助手函数来提供这个功能。这样看起来干净多了。这里有一个简单的例子:
#include <fstream>
using namespace std;
struct data
{
char first;
char second;
};
void WriteWithPadding(ofstream* outFile, data d, int width);
int _tmain(int argc, _TCHAR* argv[])
{
ofstream* outFile = new ofstream();
data data1;
data data2;
data1.first = 'a';
data1.second = 'b';
data2.first = 'c';
data2.second = 'd';
outFile->open("somefile.dat");
WriteWithPadding(outFile, data1, 4);
WriteWithPadding(outFile, data1, 4);
outFile->close();
delete outFile;
return 0;
}
void WriteWithPadding(ofstream* outFile, data d, int width)
{
if (sizeof(d) > width)
throw;
width = width - sizeof(d); // width is now amount of padding required
outFile->write(reinterpret_cast<char*>(&d), sizeof(data));
// Add Padding
for (int i = 0; i < width; i++)
{
outFile->put(0);
}
}
我假设你已经用ios::binary
打开了你的文件,因为如果你没有打开,你会遇到问题。
当写入文件时,该文件的大小仅与您写入文件的字节数一样大。因此,如果您向文件中写入三个字节,您将获得一个三字节的文件。
为了保持四字节的分辨率,您必须确保一次写入四个字节——如果您写入一个三字节的对象,请再写入一个字节(零?),使其达到四个字节。
希望这能有所帮助。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 如何在 c++ 中获取 put() 流指针的值
- C++std::ofstream-移动put指针
- 对文件的操作| get和put指针
- 为什么即使我没有使用 ostream 对象,ostream 的 put 指针也会被修改