如何从文件末尾移回 X 字节并进行编辑? (在 C++ 中使用 ofstream)

How do I move back X bytes from the end of a file and edit it? (Using ofstream in c++)

我只想将 'put' 指针从文件末尾移动到文件末尾后 'X' 字节的点。

#include <iostream>
#include <fstream>
using namespace std;
int main(){
    ofstream ofile;
    //Assuming "file.dat" does not exist
    ofile.open("file.dat", ios::binary|ios::app);
    int x = 12;
    ofile.write((char*) &x, sizeof(int));
    ofile.seekp(-4, ios::cur);
    x = 10;
    ofile.write((char*) &x, sizeof(int));
    ofile.close();

    x = 0;
    ifstream ifile("file.dat", ios::binary);
    ifile.read((char*) &x, sizeof(int));
    cout<<x; //This line should display 10
    return 0;
}

但是,输出显示 12...

Image of output here...

我看了很多关于 Whosebug 的文章,其中确实提到 'seek' 'put' 指针,我必须使用 'ios::ate',而不是 'ios::app'。

但我什至尝试使用以下方法,但我仍然没有运气......

 ofile.open("file.dat", ios::binary|ios::ate);

我做错了吗?还有另一种方法可以将 'put' 指针移回吗?

这只是我需要为学校做的项目中不起作用的部分的简单版本...

任何帮助将不胜感激...谢谢...

当您指定 ios::app 时,它意味着“始终将所有内容写入末尾,不关心 put 指针。

如果你总是想在最后开始写,但又想可以四处移动,那么你需要ios::ate,但如果你只使用ios::binary|ios::ate,那么文件将是截断。您需要添加 ios::in 才能正常工作。

这将在文件存在时起作用,并将写入到末尾,覆盖然后读取它。

#include <iostream>
#include <fstream>
using namespace std;
int main(){
    ofstream ofile;
    //Assuming "file.dat" does not exist
    ofile.open("file.dat", ios::binary|ios::in|ios::ate);
    int x = 12;
    ofile.write((char*) &x, sizeof(int));
    ofile.seekp(-4, ios::cur);
    x = 10;
    ofile.write((char*) &x, sizeof(int));
    ofile.close();

    x = 0;
    ifstream ifile("file.dat", ios::binary|ios::ate);
    ifile.read((char*) &x, sizeof(int));
    ifile.seekp(-4, ios::cur);
    cout<<x; //This line should display 10
    return 0;
}