我有一个程序可以创建一个对象,并使用这个对象的一个函数,该函数接受两个文件名并从中读取数据并设置其值。
如果对象检查ifstream
是单独打开还是应该在main
函数中完成,那么首先会尝试创建一对ifstream
值并将它们传递给这个功能?有一个草图:
int main() {
Myclass *m = new Myclass();
string file1, file2;
…initialize file1, file2…
Myclass.readFromFiles(file1, file2);
delete m;
}
在我班上:
void readFromFiles(const string &file1, const string &file2) {
std::ifstream infile1(file1);
if (!infile1.is_open()) { throw std::runtime_error("Could not open file"); }
infile1 >> value;
std::ifstream infile2(file2);
if (!infile2.is_open()) { throw std::runtime_error("Could not open file"); }
infile2 >> value2 >> value3;
}
或者更确切地说
std::ifstream open_file(std::string filename) {
std::ifstream infile(posesFilename);
if (!infile.is_open()) {
throw std::runtime_error("Could not open file");
}
else
return infile;
}
int main() {
Myclass *m = new Myclass();
string file1, file2;
…initialize file1, file2…
try{
std::ifstream f1 = open_file(file1);
std::ifstream f2 = open_file(file2);
Myclass.readFromFiles(f1, f2);
}catch (runtime_error e){
cout<< e.what() <<endl;
}
delete m;
}
在我班上:
void readFromFiles(std::ifstream &f1, std::ifstream &f2)
f1 >> value;
f2 >> value2 >> value3;
}
答案 0 :(得分:2)
在前一种情况下,您可以让函数调用者的生活更轻松。他们只需要将两个文件名传递给您的方法。该方法负责打开和关闭文件。如果您从多个位置调用此方法,则可以减少重复代码的数量。它也不是很灵活:如果来电者有ifstream&
引用,但没有文件名,则他们无法调用您的readFromFiles(filename1, filename2)
方法。
在后一种情况下,调用者可以调用您的readFromFiles()
是否有ifstream&
引用,或者如果他们只有文件名,则可以先打开文件。而且,该方法可以更灵活。将预期参数更改为istream&
而不是ifstream&
将允许您使用任何输入流作为源来读取数据。例如,可以在构造std:strstream
的位置创建单元测试,并将其传递给读取数据方法。
为了两全其美,请提供两种方法:
void readFromFiles(const string &file1, const string &file2) {
std:ifstream f1(file1);
if (!f1.is_open()) { throw std::runtime_error("Could not open file"); }
std:ifstream f2(file2);
if (!f2.is_open()) { throw std::runtime_error("Could not open file"); }
readFromFiles(f1, f2);
}
void readFromFiles(std:istream& f1, std:istream& f2) {
// ...
}
您为来电者提供了便利和灵活性。如果调用者需要知道两个文件中的哪一个无法打开(例如,他们可能想要回退&#34; file1_default&#34;如果&#34; file1&#34;不存在,则回退on&#34; file2_default&#34;如果&#34; file2&#34;不存在),他们可以完全控制打开文件以及任何无法打开的报告。