我在以二进制模式替换部分文件时遇到了一些麻烦。由于某种原因,我的seekp()行没有将文件指针放在所需的位置。现在它将新内容附加到文件的末尾,而不是替换所需的部分。
long int pos;
bool found = false;
fstream file(fileName, ios::binary|ios::out|ios::in);
file.read(reinterpret_cast<char *>(&record), sizeof(Person));
while (!file.eof())
{
if (record.getNumber() == number) {
pos=file.tellg();
found = true;
break;
}
// the record object is updated here
file.seekp(pos, ios::beg); //this is not placing the file pointer at the desired place
file.write(reinterpret_cast<const char *>(&record), sizeof(Person));
cout << "Record updated." << endl;
file.close();
我做错了吗?
提前多多感谢。
答案 0 :(得分:1)
我看不到你的while()循环是如何工作的。通常,您不应该测试eof(),而是测试读取操作是否有效。
以下代码将记录写入文件(必须存在),然后覆盖它:
#include <iostream>
#include <fstream>
using namespace std;
struct P {
int n;
};
int main() {
fstream file( "afile.dat" , ios::binary|ios::out|ios::in);
P p;
p.n = 1;
file.write( (char*)&p, sizeof(p) );
p.n = 2;
int pos = 0;
file.seekp(pos, ios::beg);
file.write( (char*)&p, sizeof(p) );
}
答案 1 :(得分:0)
while (!file.eof())
{
if (record.getNumber() == number) {
pos=file.tellg();
found = true;
break;
}
这里 - 你没有更新数字也没有记录 - 所以基本上你会浏览所有文件并写入“某些”位置(pos不是inited)
Neil Butterworth是对的(在我输入8时发布))似乎你省略了smth