我假设你正在做类似的事情,只不过你想写入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后添加。将指针移动到结尾并不是一个好主意,因为它不会改变文件大小。我尝试在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);
outFile->write(reinterpret_cast<char*>(&d), sizeof(data));
for (int i = 0; i < width; i++)
{
outFile->put(0);
}
}