我有两个问题。我试图从文件中逐行读取,但我不能让每一行单独去我可以使用的地方。此外,我无法弄清楚如何询问用户他们的文件名,而不是使用他们在程序中键入的内容。我发现的所有示例中都只有代码中的文件名,只是把它放在cin中似乎不起作用。我试图将两种不同类型的行分开,例如,abcd和1234.如果第一个值是一个字母,请做一个案例a,如果是一个数字,请做b。但我设法做的就是让getline将所有内容集中在一起,这样我就无法将其分开。有人有任何建议吗?
string x;
cout << "Enter your file: " ;
cin >> x
string line;
ifstream myfile;
myfile.open (x);
while(!myfile.eof())
{
getline(myfile,line, ' ');
}
cout << line << endl;
答案 0 :(得分:3)
用于读取文件名的cin
语句没有任何问题。只要该文件存在,您拥有的将打开该文件。但是,您可以添加一些错误检查:
std::string x;
std::cout << "Enter your file: " ;
if (!(std::cin >> x))
{
std::cerr << "Invalid input!" << std::endl;
return -1;
}
std::ifstream myfile(x);
if (myfile.is_open())
{
std::string line;
while (myfile >> line)
{
std::cout << line << std::endl;
}
}
else
{
std::cerr << "Unable to open file: " << x << std::endl;
return -1;
}
请注意正确的while
条件(不要对eof()
std::istream
条件使用while
!)。此外,如果您要在空格上分隔,则无需使用std::getline
- operator>>
也可以执行相同的操作。
如果你想根据line
的值做不同的事情,那么检查字符串。例如:
if (line[0] >= '0' && line[0] <= '9')
// do something with digits
else
// do something with non-digits
答案 1 :(得分:1)
首先,不要将eof()
置于while
条件下。这是错误的,因为iostream::eof
只会在读取流结束后设置。它并不表示下一次读取将是流的结束。看看这篇文章:Why is iostream::eof inside a loop condition considered wrong?
要分开,您可以检查该行的第一个char
是否在['0', '9']
内。
像这样:
while( getline(myfile, line) )
{
if (line[0]>='0' && line[0]<='9')
{
// start with a number (do case b)
}
else
{
// other (do case a)
}
}