我有一个程序,我指定要使用cin读取的文件,所以我运行程序./prog< file.txt,但是在下面的代码中,cin不会抓取任何东西。有人可以解释为什么代码执行后行是空的吗?
void Building::build(){
char mode;
cin >> mode >> sizeFloors >> numFloors;
if(mode == 'M')
readMap(sizeFloors, numFloors);
}
^^这个执行得很好
void Building::readMap(int floorSize, int numFloors){
string line;
int curFloor(numFloors - 1);
while( curFloor >= 0 ){
cin >> line;
if(line.empty()){
cout << "Error: input file too short" << endl;
exit(1);
}
}
^^这里line.empty()返回true
这是输入文件
M
4
1
WWWW
WWWW
WWWW
WWWW
如此清楚,行不应该返回空
答案 0 :(得分:3)
当混合格式化输入(即使用operator>>()
)和未格式化输入(例如,std::getline()
)时,您需要确保您所在的位置。格式化输入操作符停止阅读他们的格式满意的那一刻。例如,读取一个字符只读取一个字符。在输入中留下任何以下字符,例如换行符。 std::getline()
在收到的第一个换行符处停止阅读。我想,在您输入菜单选项后,您会点击换行符,这就是std::getline()
停止的位置(如果菜单选择单独位于文件中,则相同)。
在格式化和未格式化I / O之间切换时的典型方法是跳过所有前导空格:
std::getline(std::cin >> std::ws, line);
或者,您可以忽略所有内容,包括第一个换行符:
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
使用哪种方法显然取决于您的数据内容。例如,如果您想要读取前导命名空间很重要的代码,那么跳过第一个非空白区域并不是一个获奖的想法。但是,在许多使用std::ws
的情况下工作正常。
答案 1 :(得分:2)
这可能对你有帮助......
// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}
else cout << "Unable to open file";
return 0;
}
答案 2 :(得分:-1)