【问题标题】:C++ cin didn't get lineC ++ cin没有得到线
【发布时间】:2012-09-29 20:38:43
【问题描述】:

我有一个程序,我在其中指定要使用 cin 读取的文件,所以我运行程序 ./prog

 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 行后返回。你永远不会递减 curFloor 所以循环是无限的。
  • 我省略了不相关的代码,第一次运行返回空
  • 我仍然不理解人们花费更多时间来发布他们的代码,而不是在启用警告的情况下编译它(Linux 上的g++ -Wall -g),然后使用调试器(Linux 上的gdb)。学习调试程序是一项宝贵的技能(不仅仅是到处问)。
  • 可能是因为我运行了 ddd,看到该行返回空,并说它应该正在读取该行。

标签: c++ cin


【解决方案1】:

当混合格式化输入(例如,使用operator&gt;&gt;())和非格式化输入(例如,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 效果很好。

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • 我使用的是 cin,而不是文件流
    【解决方案3】:

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

    您可能想改用getline

    您可能(例如在 Linux 上)编译带有所有警告和调试信息的代码(例如使用 g++ -Wall -g),然后使用调试器(例如 gdb)找出发生了什么。

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

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

    【讨论】:

    • 不是吗>>? Nvm,你修好了
    • 文件中没有空格,每一行都是文本,后面紧跟一个回车。我最初尝试过 getline(cin, line) 但也返回了空
    • @JakeLong:如果您使用换行符或空格而不是回车符会怎样?行为相同还是不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    相关资源
    最近更新 更多