1

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

所以很明显行不应该返回空

4

3 回答 3

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效果很好。

于 2012-09-29T20:52:07.193 回答
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;
}
于 2012-09-29T20:52:22.883 回答
-1

>>运算符在读取 a 时将std::string空格作为字符串分隔符,请参见此处

您可能想改用getline

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

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

我也发现写作int curFloor(numFloors - 1);的可读性不如int curFloor = numFloors - 1;

于 2012-09-29T20:44:34.127 回答