>远未完成,但现在我正在尝试让这个程序询问文件名并将其存储在字符串中,然后转换为 ifstream,然后通过调用单独的函数来检查文件是否有效是有效的检查,如果有效,它将返回 true,如果无效,则返回 false,如果有效,主函数将输出"文件有效"。 然后它会继续重复此操作,直到进入退出。 但是它每次都返回 false,我不知道出了什么问题。 我会为任何帮助而饱满。
# include <iostream>
#include <string>
#include<fstream>
using namespace std;
bool isValid(ifstream& file)
{
if (file.good())
{
return true;
}
else
{
return false;
}
}
int main()
{
string file_name;
cout <<"please enter a HTML file name or hit 'exit' to quit and if you want to clear file please enter 'clear': ";
cin >> file_name;
ifstream my_file(file_name.c_str());
while (file_name != "exit")
{
if ((isValid(my_file)) == true)
{
cout << "Hello" << endl;
}
string file_name;
cout <<"please enter a HTML file name or hit 'exit' to quit and if you want to clear file please enter 'clear': ";
cin >> file_name;
ifstream my_file(file_name.c_str());
}
}
您遇到了一个名为"阴影"的问题。
int main() {
int i = 0;
while (i == 0) {
int i = 1; // declares a new variable that
// "shadows" (obscures) the outer i inside this scope
} // shadow i goes away, original i returns
}
上面的代码将永远运行,因为在 while 循环的上下文中i
是在 main 中声明i
。
您的代码执行以下操作:
int main()
{
// ...
ifstream my_file(file_name.c_str());
while (file_name != "exit")
{
if ((isValid(my_file)) == true) // << outer my_file
// ...
ifstream my_file(file_name.c_str()); // << scope-local variable
} // << scope local my_file goes away
}
您可能需要考虑重构代码以避免重复并简化它:
#include <iostream>
#include <fstream>
#include <string>
int main() {
for (;;) { // infinite loop
std::string file_name;
std::cout <<"please enter a HTML file name or hit 'exit' to quit and if you want to clear file please enter 'clear': " << std::flush;
if (!std::getline(std::cin, file_name))
break;
if (file_name == "exit")
break;
std::ifstream my_file(file_name);
if (!my_file.is_open()) {
std::cerr << "unable to open file " << file_name << 'n';
continue;
}
std::cout << "hellon";
}
}
我把它留给你重新引入你的isValid函数的练习。