20

次の形式の入力ファイルがあるとします。

VAL1 VAL2 VAL3
VAL1 VAL2 VAL3

VAL1 と VAL3 だけに関心のあるプログラムを書いています。C で 2 番目の値を「スキップ」したい場合は、次のようにします。

char VAL1[LENGTH]; char VAL3[LENGTH];
FILE * input_file;
fscanf(input_file, "%s %*s %s", VAL1, VAL3);

つまり、「%*s」フォーマッターを使用して、fscanf() がこのトークンを読み取ってスキップするようにします。C++ の cin でこれを行うにはどうすればよいですか? 同様のコマンドはありますか?または、ダミー変数を読み取る必要がありますか?

前もって感謝します。

4

5 に答える 5

14

C++ String Toolkit Library (StrTk)には、問題に対する次の解決策があります。

#include <string>
#include <deque>
#include "strtk.hpp"

int main()
{
   struct line_type
   {
      std::string val1;
      std::string val3;
   };

   std::deque<line_type> line_list;

   const std::string file_name = "data.txt";

   strtk::for_each_line(file_name,
                        [&line_list](const std::string& line)
                        {
                           strtk::ignore_token ignore;
                           line_type temp_line;
                           const bool result = strtk::parse(line,
                                                            " ",
                                                            temp_line.val1,
                                                            ignore,
                                                            temp_line.val3);
                           if (!result) return;
                           line_list.push_back(temp_line);
                        });

   return 0;
}

その他の例はここにあります

于 2010-12-30T20:44:59.017 に答える
7

利用可能なignore機能があります:

std::cin << val1;
std::cin.ignore (9999, ' ');
std::cin << val3;

最初の引数はスキップする文字数を定義し、2 番目のパラメーターはスキップを停止する区切り文字です。

それは醜いので、ユーザー定義のマニピュレーターにまとめることができます。


カスタム マニピュレータは次のとおりです。

template <class charT, class traits>
inline std::basic_istream<charT, traits> &
ignoreToken (std::basic_istream<charT, traits> &strm)
{
    strm.ignore (9999, ' ');
    return strm;
}

そして、次のように使用できます。

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5;

(ps -- 私はこれをコンパイルしていないので、タイプミスがあるかもしれません)。

于 2009-06-11T20:36:31.770 に答える
2

getline() を使用すると、はるかに簡単に実行できます。それを使用して行全体を取得し、トークン間の値を解析します (strtok を使用しますか?)

getline() には他にもたくさんの問題がありますが、問題は解決するはずです。

于 2009-06-11T20:33:39.403 に答える
1

ダミー変数に読み込むだけです。最終的に必要な場合は、利用可能になります。

于 2009-06-11T20:29:10.583 に答える
0

使用できます

cin.ignore(256, ' ');

これにより、最大 256 文字または空白のいずれかがすべて無視されます。

編集 (フォーマットと...): できる代替手段:

int a, b;
cin >> a >> b >> b;
于 2009-06-11T20:35:18.510 に答える