0

ファイルから読み取ろうとしています。私が使用したコードは

      ifstream is;char c;
      is.open("text.txt");
      while(is.good() && !isdigit(is.peek()))
      {     is.get(c)
            word+=c;

       }

問題は、最後の文字が 2 回読み込まれることです (なぜですか?) たとえば、ファイル内の単語がピンク色の場合、ループ後に単語の値がピンク色になります 解決策を提案してください

4

4 に答える 4

5

入力を読み取ろうとしたは、入力が成功したことを常に確認する必要があります。ストリームが読み取られる値の種類がわからない場合、最初にチェックしています。使用したい場合は、peek()おそらくstd::char_traits<char>::eof()最初にテストする必要があります。たとえば、次のようになります。

for (std::char_traits<char>::int_type c;
     std::char_traits<char>::eof() != (c = in.peek())
     && !std::isdigit(static_cast<unsigned char>(c); ) {
    ...
}

あなたのセットアップstd::istreambuf_iterator<char>では、実際にははるかに簡単なので、私は個人的に使用します:

for (std::istreambuf_iterator<char> it(in), end;
     it != end && !std::isdigit(static_cast<unsigned char>(*it); ++it) {
    word += *it;
}

char符号なしの場合もありますが、正の値が必要std::isdigit()です。通常、自分の 2 番目の名前を使用して署名するcharと、未定義の動作が発生します。この問題を回避するには、charパスを最初std::isdigit()にキャストする必要があります。unsigned char

于 2013-09-14T19:36:57.887 に答える
0

どうですか:

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

int main() {  
  std::ifstream fp("text.txt");
  std::string word;  
  char c;

  // while I am able to read a char...
  while(fp>>c) {
    //... if the char is a digit, stop reading...
    if(std::isdigit(c))
      break;
    //... otherwise append it to my word string    
    word += c;        
  }
  // close your files (or learn about scope-based destruction)
  fp.close();

  // print the resulting word
  std::cout<<word<<std::endl;

  return 0;
}

コンパイル:g++ example.cpp

入力例 ( text.txt):

a
b
c

d
e
f
8

出力例:

abcdef
于 2013-09-15T05:51:25.203 に答える
0

ループ内で get() をもう一度使用して、文字かどうかを確認します。コードは次のとおりです。

while(is.good() && !isdigit(is.peek()))
{
   is.get(c);
   word+=c;
   if(is.get(c))
   {
      is.seekg(-1,ios::cur)  //move back get pointer if its not end of file
   }
}
于 2013-09-15T05:17:14.877 に答える
0

問題は、is.good()読み取りに失敗するまで false にならないことです。したがって、最後の文字を読み取った後is.good()でも真であり、別の文字を読み取るために再度ループする (失敗する) ため、同じ文字を再度追加します。

これを回避するにis.good()は、次の文字で AFTER 読み取り (またはピーク) を呼び出す必要があります。false の場合、次の文字はありません。

  ifstream is;char c;
  is.open("text.txt");
  while(!isdigit(is.peek()) && is.good())
  {     is.get(c)
        word+=c;

  }

またはより単純で同等のもの:

  ifstream is;char c;
  is.open("text.txt");
  while (is >> c && !isdigit(c))
        word+=c;
于 2013-09-15T06:00:25.880 に答える