应该何时通知程序用户无法打开文件?

时间:2016-03-14 21:01:10

标签: c++ c++11 ifstream file-read

我有一个程序可以创建一个对象,并使用这个对象的一个​​函数,该函数接受两个文件名并从中读取数据并设置其值。

如果对象检查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;
}

1 个答案:

答案 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;不存在),他们可以完全控制打开文件以及任何无法打开的报告。