1
string numbers;
string fileName = "text.txt";


ifstream inputFile;
inputFile.open(fileName.c_str(),ios_base::in);
inputFile >> numbers;
inputFile.close();
cout << numbers;

そして、私の text.txt ファイルは次のとおりです。

1    2    3    4    5

基本的に、タブで区切られた整数のセットです。

問題は、プログラムが text.txt ファイルの最初の整数のみを読み取り、残りを何らかの理由で無視することです。整数間のタブを削除すると正常に動作しますが、それらの間にタブがあると機能しません。これは何が原因ですか?私の知る限り、空白文字は無視する必要がありますか、それとも間違っていますか? もしそうなら、テキスト ファイルからこれらの各数値を取得するより良い方法はありますか?

4

3 に答える 3

2

getlineを使用して読み取りを行います。

string numbers;
if (inputFile.is_open())//checking if open
{
      getline (inputFile,numbers); //fetches entire line into string numbers
      inputFile.close();
}
于 2012-10-27T16:59:29.720 に答える
2

フォーマットされた文字列を読み取るとき、入力演算子は先頭の空白を無視して開始します。次に、非空白文字を最初のスペースまで読み取って停止します。空白以外の文字はstd::string. ストリームがファイルの終わりに到達する前に空白文字しかない場合 (またはそのエラー)、読み取りは失敗します。したがって、プログラムは 1 つの「単語」(この場合は数字) を読み取り、読み取りを停止します。

残念ながら、あなたは自分が何をしているのか、そしてあなたのアプローチの問題は何なのかを述べただけです(問題の説明では、入力の読み取りが最初に失敗した場合をカバーできませんでした)。以下に、いくつか試してみることをお勧めします。

  1. 複数の単語を読みたい場合は、たとえばすべての単語を読み上げることで実行できます。

    std::vector<std::string> words;
    std::copy(std::istream_iterator<std::string>(inputFile),
              std::istream_iterator<std::string>(),
              std::back_inserter(words));
    

    これにより、 からすべての単語が読み取られ、 vector に s のinputFileシーケンスとして格納されます。ファイルには数字が含まれているため、簡単にアクセスできる形式で数字を読み取るために に置き換えることができます。std::stringwordsstd::stringint

  2. 単語ではなく行を読みたい場合は、std::getline()代わりに次のように使用できます。

    if (std::getline(inputFile, line)) { ... }
    

    複数の行を読み取りたい場合は、この操作をループに入れます。残念ながら、単語の場合のように一連の行を読み取るための read-made アプローチはありません。

  3. 最初の行だけでなく、ファイル全体をファイルに読み込みたい場合は、以下も使用できますが、ファイルにstd::getline()存在しない 1 つの文字値、たとえば null 値について知る必要があります。

    if (std::getline(inputFile, text, char()) { ... }
    

    このアプローチでは、「行」をヌル文字までの一連の文字と見なします。他の文字値も使用できます。文字の値がわからない場合は、std::stringイテレータを取る のコンストラクタを使用してファイル全体を読み取ることができます。

    std::string text((std::istreambuf_iterator<char>(inputFile)),
                     std::istreambuf_iterator<char>());
    

    残念ながら、最初のパラメーターを囲む追加のかっこのペアが必要であることに注意してください (C++ 2011 を使用している場合は、かっこの代わりに中かっこを使用することで回避できます)。

于 2012-10-27T18:33:40.393 に答える
-1

プログラムは説明とまったく同じように動作します。inputFile >> numbers;入力ファイルの最初の整数を抽出するだけなので、タブを抑制すると、 5 5inputFile>>の数値ではなく数値が抽出されます。12345[1,2,3,4,5]

より良い方法:

vector< int > numbers;
string fileName = "text.txt";
ifstream inputFile;
inputFile.open(fileName.c_str(),ios_base::in);
char c;
while (inputFile.good())     // loop while extraction from file is possible
{
    c = inputFile.get();       // get character from file
    if ( inputFile.good() and c!= '\t' and c!=' ' ) // not sure of tab and space encoding in C++
    {
      numbers.push_back( (int) c);
    }
}
inputFile.close();
于 2012-10-27T17:14:27.480 に答える