如何防止我的记录覆盖c ++
cin.get (terminator);
FILE * dat = fopen("Accounts.dat", "wb");
myAccount.username = myUsername;
myAccount.password = myPassword;
int n = 0;
int filenumber=0;
filenumber= n;
fseek(dat,sizeof(myAccount), ios_base :: end);
fwrite(&myAccount, sizeof(myAccount),ios_base ::app, dat);
fclose (dat);
答案 0 :(得分:0)
请勿将FILE*
与std::fstream
混合使用。使用其中一种。
std::fstream File("Accounts.dat", std::ios::out | std::ios::binary | std::ios::app);
if (File.is_open())
{
File.write(reinterpret_cast<char*>(&myAccount), sizeof(myAccount));
File.close();
}
或使用C:
FILE* file = fopen("meh.dat", "ab+");
if (file)
{
fwrite(&myAccount, sizeof(myAccount), 1, file);
fclose(file);
}
答案 1 :(得分:0)
一些理论:fseek
是stdio.h中的C例程(C ++中的<cstdio>
)。它适用于C文件描述符,如下所示
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fseek ( pFile , 0 , SEEK_SET );
fputs ("fopen example",pFile);
fclose (pFile);
}
return 0;
}
请注意与SEEK_SET
一起使用的fseek
标记。
ios_base::end
和类似的是与<fstream>
例程结合使用的C ++成员常量,如下所示
#include <fstream> // std::fstream
int main () {
std::fstream fs;
fs.open ("test.txt", std::fstream::in | std::fstream::out | std::fstream::app);
fs << " more lorem ipsum";
fs.close();
return 0;
}
你应该从不在任何时候混合它们,它不是类型安全的,即使它工作也不能保证它会,而且它不是便携式的,也是一个糟糕的代码实践。
没有多少可以从你的小片段推断,但如果你遇到奇怪或错误的行为,你应该首先检查这些概念。
参考文献: http://www.cplusplus.com/reference/cstdio/fseek/ http://www.cplusplus.com/reference/fstream/fstream/open/