我想调用函数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;
}
}
答案 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)
您对nameOnFile
中read
的来电并不能满足您的需求。您将读取文件名,但只是忽略它。如果你想这样做,你需要声明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
...)