1

次のような数字の行を含むファイルがあります。

1.000000-5 2.436700+0 2.530000-2 2.436700+0 5.000000-2 2.436700+0
1.000000+1 2.436700+0 1.000000+2 2.433800+0 1.000000+3 2.433800+0

数値を取得するには、C++ でこれを読み取る必要があります

1.0E-5 2.4367E0 2.53E-2 2.4367E0 5.0E-2 2.4367E0
1.0E1 2.4367E0 1.0E2 2.4338E0 1.0E3 2.4338E0

課題はE、ファイルの数がないことです。はE指数表記を示します。

このようなものをフロートに読み込むにはどうすればよいですか? ファイルごとに何十万回も何百万回も読み取る必要があるため、非常に効率的である必要があります。

これを実現する方法について何か提案はありますか?

4

4 に答える 4

3

すべての - または + の前に E を追加し、その上でatoforを使用strtofするだけです。

これが十分に速くない場合は、お気に入りの実装をチェックしてatof(簡単な検索では見つけられませんでしたが、それほど難しくはないはずです)、E を検索しないように変更してください。 、ただし - または + のみ。

于 2013-08-29T20:40:14.213 に答える
0

+ または - (またはスペース) 文字まで文字列をスキャンし、それを保存します。+ または - を null に置き換え、文字列を atof に渡して最初の部分を取得します。次に、指数に + または - スキャンがある場合。それをintまたはdoubleにしたら、を使用しますvalue * pow(10.0, exponent)。または、strtod を使用して null の変更を回避することもできます。

または、前述のように、既存の atof 実装を変更します。

于 2013-08-29T20:42:13.240 に答える
0

これは私がすぐにまとめたものです。すべてのケースで機能するかどうかをテストする必要があります。

ifstream file;
file.open("f:\\stackoverflow\\fortranfloat\\fortranfloats.txt");

string line;
if (file.is_open())
{
    while (file.good())
    {
        getline(file, line);
        for (int i = 0; i < line.length(); i++)
        {
            int j = 0;
            char buf[10];
            while (i < line.length() && line[i] != ' ')
            {
                if (line[i] == '-' || line[i] == '+')
                    buf[j++] = 'e';

                buf[j++] = line[i++];
            }
            float number = atof(buf);
            cout << "Number: " << number << endl;
        }
    }
    file.close();
}
else
{
    cout << "Failed to open file" << endl;
}
于 2013-08-29T21:01:02.137 に答える