C ++ std :: ofstream - 移动put指针

时间:2015-11-17 23:22:12

标签: c++ file ofstream

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

我可以创建一个包含零的新数据块并写出来,但这似乎是不必要和笨拙的。如何将put指针沿1,2或3个字节移动?

我不知道该怎么做,因为如果我调用seekp()肯定会将指针移到当前文件大小之外?我认为ofstream.write()正确处理了这个问题?即:它在写入数据时以某种方式调整文件大小?

2 个答案:

答案 0 :(得分:1)

我假设你正在做类似的事情,除了不要写两个字节的数据,你想用一些填充写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;
}

一个选项是简单地使struct 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之后添加了padding而不是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); // 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);
    }
}

答案 1 :(得分:0)

为了迂腐,我认为你已经用ios::binary打开了你的档案,因为如果你还没有问题,你就会遇到问题。

文件时,该文件只与您写入文件的字节数一样大。因此,如果您向文件写入三个字节,您将拥有一个三字节文件。

要保持四字节分辨率,必须确保一次写入四个字节 - 如果写一个三字节对象,则写一个额外的字节(零?)以使其达到四个字节。 / p>

希望这有帮助。