2017-11-11 9 views
1

私はC++を学んでいますので、私と一緒にご負担をして、あらかじめ馬鹿馬鹿しいことをお詫び申し上げます。getline()を無限に実行している単語C++プログラムのマッチング?

「command.txt」というファイルの各行の最初の単語が「num_lines」、「num_words」、「num_chars」のいずれかに一致するコードを作成しようとしています。

最初の行の最初の単語が前述の単語と一致しない場合は、次の行が読み込まれます。 一致する単語(最初の単語のみ!)にヒットすると、一致する単語が出力されます。

#include <iostream> 
#include <fstream> 
    #include <string> 

using namespace std; 

ifstream comm_in("commands.txt"); // opens file 
string command_name = "hi"; // stores command from file 


bool is_command() { 
    if (command_name == "num_words" || command_name == "num_chars" || command_name == "num_lines") { 
     return true; 
    } else { 
     return false; 
    } 
} 


// FIND a first word of a line in file THAT MATCHES "num_words", "num_chars" or "num_lines" 
void get_command() { 

    string line; 
    char c; 

    while (!is_command()) { // if command_name does not match a command 

     // GET NEXT LINE OF FILE TO STRING 
     getline(comm_in, line); 

     // SUPPOSED TO GET THE FIRST WORD OF A STRING (CANT USE SSTREAM) 
     for (int i = 0; i < line.size(); i++) { // increment through line 
      c = line[i]; // assign c as index value of line 

      if (c == ' ' || c == '\t') { // if c is a space/tab 
       break; // end for loop 
      } else { 
       command_name += c; // concatenate c to command_name 
      } // if 
     } // for 
    } // while 
    return; 
} 

int main() { 

    get_command(); 
    cout << command_name; // supposed to print "num_lines" 
} 

command.txtファイルの内容::

my bear is happy 
and that it 
great ha 
num_lines sigh 

それは正しくコンパイルが、私は私の端末でそれを実行すると、何も現れません。ここ

は、私のコードのすべてです;それはロードを停止するようには思われません。 これを修正するにはどうすればよいですか?

+0

if(getline(comm_in, line))に等しいです。何が止まるのですか? – Jay

+0

whileループは、is_commandがtrueを返すとき、つまりcommand_name == "num_lines"のときに停止するので、command.txtファイルの4行目を読み終えたら停止する必要がありますか?この論理に何か問題はありますか? – Salvatross

+0

これはどうしますか?ループを終了すると、プログラムを印刷して終了する必要があります。 – Jay

答えて

0

何か問題が発生し、ファイルの最後に達した場合、ループは決して停止しません。 getline(comm_in, line)if(!getline(comm_in, line)) break;に変更するか、それをループの条件として使用することをお勧めします。

ます。また、各パスのためcommand_nameをリセットする必要があります。

while(getline(comm_in, line)) 
{ 
    command_name = ""; 
    for(int i = 0; i < line.size(); i++) 
    { 
     c = line[i]; 
     if(c == ' ' || c == '\t') 
      break; 
     else 
      command_name += c; 
    } 
    if(is_command()) 
     break; 
} 
1

あなた本当にあなたはグローバル変数を使用しての習慣から抜け出すにしたい(いわば)午前中に自分を憎むようにしたい場合を除き。 get_commandを(少なくとも)2つの関数、特にその行を含む文字列から最初の単語を取得する関数に分割すると、ほぼ確実に簡単に人生を見つけることができます。

私はより多くのこのようなコードを記述します:これはまだ完璧ではない(例えば、ひどく形成された入力はまだそれが失敗する可能性があります)が、少なくとも、それは私が「何で動きだ

bool is_cmd(std::string const &s) { 
    return s == "num_words" || s == "num_chars" || s == "num_lines"; 
} 

std::string first_word(std::istream &is) { 
    std::string line, ret; 

    if (std::getline(is, line)) { 
     auto start = line.find_first_not_of(" \t"); 
     auto end = line.find_first_of(" \t", start); 
     ret = line.substr(start, end - start); 
    } 
    return ret; 
} 

void get_command(std::istream &is) { 
    std::string cmd; 

    while (!(cmd = first_word(is)).empty()) 
     if (is_cmd(cmd)) { 
      std::cout << cmd; 
      break; 
     } 
} 

dは良い方向です。

0
// FIND a first word of a line in file THAT MATCHES "num_words", "num_chars" or "num_lines" 
void get_command() 
{ 
    string line; 
    char c; 

    while (!is_command()) { // if command_name does not match a command 

     // GET NEXT LINE OF FILE TO STRING 
     if(getline(comm_in, line),comm_in.fail()){ 
      // end reading 
      break; 
     } 

     //clear 
     command_name = ""; 

     // SUPPOSED TO GET THE FIRST WORD OF A STRING (CANT USE SSTREAM) 
     for (int i = 0; i < line.size(); i++) { // increment through line 
      c = line[i]; // assign c as index value of line 

      if (c == ' ' || c == '\t') { // if c is a space/tab 
       break; // end for loop 
      } else { 
       command_name += c; // concatenate c to command_name 
      } // if 
     } // for 
    } // while 
    return; 
} 

この問題の鍵は、command_nameをクリアしなかったことです。

さらに、ファイルの最後に到達するかどうかについて裁判官を追加する必要があります。

PS:if(getline(comm_in, line),comm_in.fail())あなた `while`ループが何をしているかを見

関連する問題