gpt4 book ai didi

C++ std::ofstream - 移动放置指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:16:20 25 4
gpt4 key购买 nike

我正在将一些数据写入文件。有时,我想从内存中写入一个数据 block ,然后将 put 指针移动 1、2 或 3 个字节以保持 4 字节的数据边界格式。

我可以制作一个包含零的新数据 block 并写入它,但这似乎没有必要且笨拙。如何将 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);
}
}

关于C++ std::ofstream - 移动放置指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33768985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com