0

この形式のファイル内の各行から 2 つの int 値を取得する必要がある状況があります。

43=>113
344=>22

区切り文字を => に設定し、>> 演算子を使用して int を割り当てるようなことは可能ですか?

ifstream iFile("input.in");
int a,b;
iFile >> a >> b;

同様の形式で出力するために自動的に行うこともできますか?

oFile << a << b;

それ以外の

oFile << a << "=>" << b;

ありがとう。

4

3 に答える 3

1

aおよびbが組み込み型の変数である場合、それらをストリーミングするための独自のユーザー定義演算子を定義することはできません (標準ライブラリは既にそのような関数を提供しています) 。

必要な動作でコードを書き出すことができます...

int a, b;
char eq, gt;

// this is probably good enough, though it would accept e.g. "29 = > 37" too.
// disable whitespace skipping with <iomanip>'s std::noskipws if you care....
if (iFile >> a >> eq >> gt >> b && eq == '=' && gt == '>')
    ...

ORabを or にラップし、classそのためstructのプロバイダー ユーザー定義演算子を指定します。そのようなストリーミング関数の書き方を説明する答えを含む SO の質問がたくさんあります。

またはサポート関数を書く...

#include <iomanip>

std::istream& skip_eq_gt(std::istream& is)
{
    char eq, gt;

    // save current state of skipws...
    bool skipping = is.flags() & std::ios_base::skipws;

    // putting noskipws between eq and gt means whatever the skipws state
    // has been will still be honoured while seeking the first character - 'eq'

    is >> eq >> std::noskipws >> gt;

    // restore the earlier skipws setting...
    if (skipping)
        is.flags(is.flags() | std::ios_base::skipws);

    // earlier ">>" operations may have set fail and/or eof, but check extra reasons to do so
    if (eq != '=' || gt != '>')
        is.setstate(std::ios_base::failbit)

    return is;
}

...では、このように使用してください...

if (std::cin >> a >> skip_eq_gt >> b)
    ...use a and b...

ストリームは、ストリームの一部の側面 (たとえば、) を再構成する「io マニピュレーター」関数を受け入れるように設計されているため、この関数は「機能します」std::noskipwsが、関数を呼び出すには、(入力) io マニピュレーターのプロトタイプと一致する必要があります。 : std::istream& (std::istream&).

于 2013-07-16T08:14:46.190 に答える
1

読み取りまたは書き込み時に追加のコードなしで直接行うことはできませんが、それをより明示的に処理するマニピュレーターを作成できます。

std::istream&
mysep( std::istream& source )
{
    source >> std::ws;      //  Skip whitespace.
    if ( source.get() != '=' || source.get() != '>' ) {
        //  We didn't find the separator, so it's an error
        source.setstate( std::ios_base::failbit );
    }
    return source;
}

次に、次のように記述します。

ifile >> a >> mysep >> b;

、セパレーターが存在しないというエラーが表示されます。

出力では、同様のマニピュレータを使用できます。

std::ostream&
mysep( std::ostream& dest )
{
    dest << "=>";
    return dest;
}

これには、読み取りまたは書き込みを行っている場所に分散するのではなく、これら 2 つの特定の関数 (同じソース ファイル内で隣り合って定義される) でセパレータが分離されているものに関する情報を保持するという利点があります。

また、これらのデータは、コード内の特定の種類の情報を表していると考えられます。もしそうなら、おそらくそれをクラスとして定義してから、そのクラスに対して演算子>>を定義する必要があります<<

于 2013-07-16T08:41:13.740 に答える
0

デリミネーターとして常に使用している場合=>は、ドキュメントの行を解析する関数を作成できます。

void Parse(ifstream& i)
{
   string l;
   while(getline(i,l))
   {
      //First part
      string first = l.substr(0, l.find("=>"));

      //Second part
      string second = l.substr(l.find("=>")+2, l.length());

      //Do whatever you want to do with them.
   }
}
于 2013-07-16T08:12:50.793 に答える