如何从文件末尾移回 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;
}
我只想将 '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;
}