11

セミコロン区切り文字を含むファイルを読み取るときに、古い C コードを新しい C++ に「アップグレード」したい場合の最適なオプションは何ですか?

/* reading in from file C-like: */
fscanf(tFile, "%d", &mypost.nr); /*delimiter ; */
fscanf(tFile, " ;%[^;];", mypost.aftername);/* delimiter ; */
fscanf(tFile, " %[^;]", mypost.forename);   /*delimiter ; */
fscanf(tFile, " ;%[^;];", mypost.dept);/*delimiter ; */
fscanf(tFile, " %[^;];", mypost.position);/* delimiter ; */
fscanf(tFile, "%d", &mypost.nr2);

//eqivalent best C++ method achieving the same thing?
4

3 に答える 3

11

構造体の istream で右シフト演算子をオーバーロードできます。

std::istream& operator>>(std::istream& is, mypost_struct& mps) {
    is >> mps.nr;
    is.ignore(1, ';');
    is.getline(mps.forename, 255, ';');
    is.getline(mps.aftername, 255, ';');
    is >> mps.dept;
    is.ignore(1, ';');
    is >> mps.position;
    is.ignore(1, ';');
    is >> mps.nr2;

    return is;
}

その後、入力は と同じくらい簡単です。 はis >> mypost;is開いたファイルです。

編集: @UncleBens ご指摘ありがとうございます。スペースを考慮するのを忘れていました。前名と後名にスペースが含まれている可能性が高いと仮定して、回答を更新しました。そして、区切り文字が二重引用符で囲まれていることについて、このかなり恥ずかしいビットがありました...

以下のように構造体定義を使用して確認しました。

struct mypost_struct {
    int nr;
    char forename[255], aftername[255];
    int dept, position, nr2;
};

..そして結果は予想通りでした。

于 2010-03-29T11:49:04.197 に答える
3

@susmits が言うように、次のように、返されたストリームを条件として使用することもできます。

if (is >> mps.nr && is.ignore(1, ";") && is >> mps.aftername && ...) {
   // all is well ...
} else {
   // bad input format
}

あるいは:

if (is >> mps.nr >> ignore(";") >> mps.aftername >> ...) {
    // all is well ...
} else {
    // bad input format
}
于 2010-03-29T11:59:18.210 に答える
1

古い C コードを新しい C++ に「アップグレード」したい場合、最適なオプションは何ですか?

私見、これを行う最善の方法は、ファイルを行ごとに読み取り、解析に正規表現を使用することです。

于 2010-03-29T17:54:58.020 に答える