C ++ cin没有得到线

时间:2012-09-29 20:38:43

标签: c++ cin

我有一个程序,我指定要使用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

如此清楚,行不应该返回空

3 个答案:

答案 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)

>>运算符在读取std::string时将空格作为字符串分隔符,请参阅here

您可能希望改为使用getline

您可能(例如在Linux上)使用所有警告和调试信息(例如使用g++ -Wall -g)编译您的代码,然后使用调试器(例如gdb)来查找正在发生的事情。

我建议在循环内line.clear()

我还发现写作int curFloor(numFloors - 1);的可读性低于int curFloor = numFloors - 1;