3

次のようなファイルがあります。

 1.0000000e+01   8.0123000e+01   1.0000000e+01   1.0000000e+01   1.0000000e+01
-1.0000000e+01   1.0000000e+01   1.0001110e+01   1.0000000e+01   1.0000000e+01
 1.0000000e+01   1.0000000e+01  -5.0000000e+01   1.0000000e+01   1.0000000e+01
 //... (repeated scientific numbers)
 1 2 3 4
 2 4 5 60
 100 3 5 63
 //... (repeated integer numbers)

これらの数値を C++ のファイルから読み取りたいのですが、科学的形式の数値のみを読み取るため、数値形式が変更されたときにコードを停止する必要があります。また、整数は 4 列であるのに対し、浮動小数点数は 5 列であるという利点もあります。

では、C++ でそれを行う最善の方法は何ですか?

4

5 に答える 5

2

EOL を無視する (整数の読み取りを続行する):

typedef double d[5] Datum;
Datum d;
vector<Datum> data;
while (true) {
  Datum t;
  istr >> t[0] >> t[1] >> t[2] >> t[3] >> t[4];
  if (!istr) break;
  data.push_back(t);
}

列数と EOL の使用:

while (istr) {
  string line;
  getline(istr, line);
  Datum t;
  istringstream temp(line);
  temp >> t[0] >> t[1] >> t[2] >> t[3] >> t[4];
  if (temp.fail()) break;
  data.push_back(t);
}
于 2011-03-31T12:16:08.687 に答える
0

strstrを使用して、各行の「e+」を検索できます。

http://www.cplusplus.com/reference/clibrary/cstring/strstr/

もっと凝ったものにしたい場合は、正規表現ライブラリ(boost :: regexなど)を使用します。これは、各行から文字列を抽出するのにも役立ちます。

于 2011-03-31T12:12:44.880 に答える
0

これを行う直接的な方法はないのではないかと思います。>>つまり、特定の形式で浮動小数点数()をストリーミングすることはできません。したがって、その機能が必要な場合は、行を文字列として読み取り、手動で解析する必要があります。もちろん、これは、数字ごとに浮動小数点数を作成する必要があるという意味ではありません。floatを読み取る入力ファイルの境界を確立したら、を使用stringstreamsしてそれらを読み取ります。

于 2011-03-31T12:13:07.983 に答える
0

正規表現を使用して、気になるものだけを一致させることができます:-?\d+\.\d+e[+-]\d+

これが最善の方法ではないことは確かですが、パフォーマンスが大きな問題でなければ、簡単な方法です

警告: RegexBuddy から自動生成されたコード

pcre *myregexp;
const char *error;
int erroroffset;
int offsetcount;
int offsets[(0+1)*3]; // (max_capturing_groups+1)*3
myregexp = pcre_compile("-?\\d+\\.\\d+e[+-]\\d+", 0, &error, &erroroffset, NULL);
if (myregexp != NULL) {
    offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, 0, offsets, (0+1)*3);
    while (offsetcount > 0) {
        // match offset = offsets[0];
        // match length = offsets[1] - offsets[0];
        if (pcre_get_substring(subject, &offsets, offsetcount, 0, &result) >= 0) {
            // Do something with match we just stored into result
        }
        offsetcount = pcre_exec(myregexp, NULL, subject, strlen(subject), 0, offsets[1], offsets, (0+1)*3);
    } 
} else {
    // Syntax error in the regular expression at erroroffset
}
于 2011-03-31T12:13:29.170 に答える
-1

正規表現はこれを行うための最良の方法です。代わりに、fscanf ()で試すことができます

于 2011-03-31T12:18:27.570 に答える