打开读/写的fstream(二进制)

时间:2015-06-07 23:19:50

标签: c++ if-statement fstream ofstream

此程序中的用户可以使用许多选项: 选项1:记录条目(由EOF密钥终止)。 选项2:显示记录。选项3:退出计划。

然后,用户可以重复此过程。我希望避免通过寻找文件的末尾来覆盖记录,并确保close()和open()调用是正确的。

宣布后:

fstream fs("file", ios_base::in | ios_base::out | ios_base::binary);

是否有必要明确调用open;

fs.open("file", ios_base::in | ios_base::binary);

如果有必要:必须指定二进制模式吗?是否有必要在连续写作之前清除流?

struct record
{
    char firstname[MAX], lastname[MAX];
    int score;
};

int main(){

  record r;
  // must the modes be listed in a particular order?
  fstream fs("file", ios_base::in |ios_base::out | ios_base::binary);

  if(choice == 1) // option 1 for writing 
  {
    fs.clear(); // is it necessary to clear?
    // is it necessary to explicitly call open [and close] within 'if'
    fs.open("file", ios_base::in | ios_base::binary); 
    fs.seekp(0, ios_base::end); //attempt to avoid overwriting previous records 

    fs.write( (char *)&r, sizeof(r) );
    fs.close(); // is it best to close the file here...
  } 
  else if(choice == 2){ /*Display records*/ }
  else if(choice == 3){ exit(1); }

  /* would it be incorrect to fs.close() here and not call fs.open() */

  return 0;
}

1 个答案:

答案 0 :(得分:1)

  

宣布后:

fstream fs("file", ios_base::in | ios_base::out | ios_base::binary);
     

是否有必要明确调用open;

fs.open("file", ios_base::in | ios_base::binary);

文件流可以在它们的构造函数中打开,也可以通过调用成员函数open()来打开。如果在调用open()之前已经打开了文件,那么这是流错误报告的错误。如果文件已被打开,则调用open()

请注意,您可以默认构造文件流,这样您就不必决定如何在构造时打开流。

std::fstream fs;

这是一个没有关联文件的流,所以现在你可以用正确的语义调用open()

  

是否必须指定二进制模式?

是的,二进制模式永远不是默认的打开模式。如果您需要文件处于二进制模式,则需要指定此选项。

  

是否有必要在连续写入之前清除流?

成员函数clear()用于清除错误掩码,由于读/写/等失败,可以写入错误掩码。只有当你想要清除的错误时,才可以这样做。但是您可能不需要这样做,因为您刚刚打开文件而没有任何先前的IO操作。

  

这里fs.close()不正确,而不是致电fs.open()

除非您想在流上打开新文件,否则通常不需要显式调用close()。由于std::fstreamRAII类,因此close()将在其范围的末尾(主要结束时)调用。

如果您需要打开新文件,则应在致电close()之前先致电open()

另外,建议:如果要在最后打开文件,请使用std::ios_base::ate openmode:

if (choice == 1) {
    fs.open("file", ios_base::in | ios_base::binary | ios_base::ate);
    //                                                ^^^^^^^^^^^^^
    fs.write( (char *)&r, sizeof(r));
}