如何防止我的记录覆盖c ++

时间:2014-04-11 18:31:38

标签: c++

如何防止我的记录覆盖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);

2 个答案:

答案 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/