为什么从函数返回main?

时间:2015-12-12 14:37:34

标签: c++

我想调用函数nameOnFile();输入文件名。 返回的字符串被发送到read();加载文件并检查它。 如果文件不存在,我想让用户有机会重新开始。

首次尝试有效。但是第二个错误,程序跳回到主程序。

*这就是发生的事情......

什么是文件的名称?的 wrongFile

文件coulde note是opend

你想再试一次吗? j / n j

什么是文件的名称?的 wrongFileAgain

你想再试一次吗? j / n j

您想再次测试该程序吗? Ĵ/ N

*结束

最后一个字符串来自main。该程序不应该返回nameOneFile()函数吗?

我该如何解决这个问题?

int main(){

    string receivedFilename, receivedString;
    char x;

    do{
    receivedFilename = nameOnFile();
    receivedString = read(receivedFilename);

        cout << "\nDo you want to test the program again? j/n " << endl;
        cin >> x;
        cin.ignore(10000,'\n');


    }while(x == 'j' || x == 'J');
}


string nameOnFile(){

    string nameOnFileTxt;

    cout << "What is the name of the file?";
    getline(cin, nameOnFileTxt);

    if(nameOnFileTxt.rfind(".txt") > nameOnFileTxt.length()){

        nameOnFileTxt.append(".txt");

    }

   return nameOnFileTxt;
   }


string read(string theFileNamn){

    ifstream fin(theFileNamn.c_str());
    string fileAsString, words;
    char x;

    if ( !fin ){

      cout << "The file could not be opened" << endl;
      cout << "Do you want to try again? j/n" << endl;

      cin >> x;
      cin.ignore(10000,'\n');

      if(x == 'j' || x == 'J'){

          nameOnFile();
      }
      else{

          exit( EXIT_FAILURE );
      }

    }
    else{

       while(getline(fin, words)){

          fileAsString.append(words);

    }

    return fileAsString;
    }
}

3 个答案:

答案 0 :(得分:1)

// this does not change again, it compares it against true, return value is unused
again == true;

不是作业,这是:

again = true;

要做的更简单:

do { ... } while(x == 'j' || x == 'J');
你不觉得吗?

答案 1 :(得分:0)

您对nameOnFileread的来电并不能满足您的需求。您将读取文件名,但只是忽略它。如果你想这样做,你需要声明fin(但不要打开它),然后循环,直到你成功打开文件,或者用户不想再试一次。

答案 2 :(得分:0)

要让非本地控制流从​​某个内部函数跳回到main,您可能需要一些exception handling

详细了解C++ exceptions(及其relation with destructors,特别是RAII),throw表达式,try-catch块。您可以在内部函数中考虑一些throw std::runtime_error("message");,并在try {中使用} catch(std::runtime_error err) { ... } ... main(或者您可以考虑拥有你自己的异常类,继承自std::runtime_error ...)

Programming using C++

上阅读一本好书