打开一个 fstream 进行读/写(二进制)
Opening an fstream for reading/ writing (binary)
在此程序中,用户可以使用许多选项:
选项 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;
}
After declaring:
fstream fs("file", ios_base::in | ios_base::out | ios_base::binary);
is it necessary to explicitly call open;
fs.open("file", ios_base::in | ios_base::binary);
文件流可以在它们的构造函数中打开,也可以通过调用成员函数open()
打开。如果文件在调用 open()
之前已经打开,那么这是流错误报告的错误。如果文件已经打开,不需要调用open()
。
请注意,您可以默认构建文件流,这样您就不必在构建时决定如何打开流。
std::fstream fs;
这是一个没有关联文件的流,所以现在您可以用正确的语义调用 open()
。
must binary mode be specified?
是的,二进制模式从来都不是默认的打开模式。如果你需要一个文件是二进制模式,那么这个选项需要被指定。
is it necessary to clear the stream prior to writing successively?
成员函数clear()
是用来清除错误掩码的,可以写入失败read/write/etc。仅当存在您希望清除的错误时才可以这样做。但是您可能不需要这样做,因为您只是打开文件而没有进行任何先前的 IO 操作。
would it be incorrect to fs.close()
here and not call fs.open()
您通常不需要显式调用 close()
除非您想在流中打开一个新文件。由于 std::fstream
是一个 RAII class,close()
将在其范围的末尾(在 main 的末尾)被调用。
如果你需要打开一个新文件,那么你应该先调用close()
,然后再调用open()
。
另外,一个建议:如果你想在最后打开一个文件,那么使用std::ios_base::ate
打开模式:
if (choice == 1) {
fs.open("file", ios_base::in | ios_base::binary | ios_base::ate);
// ^^^^^^^^^^^^^
fs.write( (char *)&r, sizeof(r));
}
在此程序中,用户可以使用许多选项: 选项 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;
}
After declaring:
fstream fs("file", ios_base::in | ios_base::out | ios_base::binary);
is it necessary to explicitly call open;
fs.open("file", ios_base::in | ios_base::binary);
文件流可以在它们的构造函数中打开,也可以通过调用成员函数open()
打开。如果文件在调用 open()
之前已经打开,那么这是流错误报告的错误。如果文件已经打开,不需要调用open()
。
请注意,您可以默认构建文件流,这样您就不必在构建时决定如何打开流。
std::fstream fs;
这是一个没有关联文件的流,所以现在您可以用正确的语义调用 open()
。
must binary mode be specified?
是的,二进制模式从来都不是默认的打开模式。如果你需要一个文件是二进制模式,那么这个选项需要被指定。
is it necessary to clear the stream prior to writing successively?
成员函数clear()
是用来清除错误掩码的,可以写入失败read/write/etc。仅当存在您希望清除的错误时才可以这样做。但是您可能不需要这样做,因为您只是打开文件而没有进行任何先前的 IO 操作。
would it be incorrect to
fs.close()
here and not callfs.open()
您通常不需要显式调用 close()
除非您想在流中打开一个新文件。由于 std::fstream
是一个 RAII class,close()
将在其范围的末尾(在 main 的末尾)被调用。
如果你需要打开一个新文件,那么你应该先调用close()
,然后再调用open()
。
另外,一个建议:如果你想在最后打开一个文件,那么使用std::ios_base::ate
打开模式:
if (choice == 1) {
fs.open("file", ios_base::in | ios_base::binary | ios_base::ate);
// ^^^^^^^^^^^^^
fs.write( (char *)&r, sizeof(r));
}