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()せる場合、関心のある場所にいることを確認する必要があります。たとえば、文字を読み取ると、その 1 文字だけが読み取られます。後続の文字 (改行など) はすべて入力に残されます。std::getline()受信した最初の改行で読み取りを停止します。メニュー選択を入力した後、改行を押すと、これが停止する場所だと思いますstd::getline()(メニュー選択がそれ自体のファイルにある場合も同じです)。

フォーマットされた I/O とフォーマットされていない 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 などで) すべての警告とデバッグ情報を含めて (たとえば を使用して) コードをコンパイルしg++ -Wall -g、デバッガー (たとえばgdb) を使用して何が起こっているかを調べることができます。

line.clear()ループの内側に提案します。

私はまた、書くことint curFloor(numFloors - 1);はより読みにくいと感じていますint curFloor = numFloors - 1;

于 2012-09-29T20:44:34.127 に答える