3

ここに精神的に非常に似ている質問があります。残念ながら、その質問はあまり反応を促しませんでした。別の方法が提案されることを期待して、より具体的な質問をしたいと思いました。

std::cinバイナリファイルを(with )に書き込んでいますtar --to-command=./myprog。バイナリファイルはたまたまfloatのセットであり、データを入れたいと思いますstd::vector<float>-理想的にはc++の方法です。

私は非常にうまく生成できます(この回答std::vector<char>のおかげで )

#include <fstream>
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

int
main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<char> buffer;
  std::copy( 
        std::istreambuf_iterator<char>(input), 
           std::istreambuf_iterator<char>( ),
           std::back_inserter(buffer)); // copies all data into buffer
}

私は今、自分std::vector<char>std::vector<float>、おそらくwithstd::transformと変換を行う関数(たとえば、achar[2]からa )に変換したいと思っていfloatます。しかし、私は苦労しています。なぜなら、私std::vector<float>の要素はの半分になるからstd::vector<char>です。2のストライドで繰り返すことができれば、私は大丈夫だと思いますが、前の質問から、私はそれを行うことができないようです(少なくともエレガントではありません)。

4

3 に答える 3

5

2つの文字を読み取り、それをfloatに変換する独自のクラスを作成します。

struct FloatConverter
{
    // When the FloatConverter object is assigned to a float value
    // i.e. When put into the vector<float> this method will be called
    //      to convert the object into a float.
    operator float() { return 1.0; /* How you convert the 2 chars */ }

    friend std::istream& operator>>(std::istream& st, FloatConverter& fc)
    {
        // You were not exactly clear on what should be read in.
        // So I went pedantic and made sure we just read 2 characters.
        fc.data[0] = str.get();
        fc.data[1] = str.get();
        retun str;
    }
    char   data[2];
 };

GManによるコメントに基づく:

struct FloatConverterFromBinary
{
    // When the FloatConverterFromBinary object is assigned to a float value
    // i.e. When put into the vector<float> this method will be called
    //      to convert the object into a float.
    operator float() { return data }

    friend std::istream& operator>>(std::istream& st, FloatConverterFromBinary& fc)
    {
        // Use reinterpret_cast to emphasis how dangerous and unportable this is.
        str.read(reinterpret_cast<char*>(&fc.data), sizeof(float));
        retun str;
    }

    float  data;
};

次に、次のように使用します。

int main  (int ac, char **av)
{
  std::istream& input = std::cin;
  std::vector<float> buffer;

  // Note: Because the FloatConverter does not drop whitespace while reading
  //       You can potentially use std::istream_iterator<>
  //
  std::copy( 
           std::istreambuf_iterator<FloatConverter>(input), 
           std::istreambuf_iterator<FloatConverter>( ),
           std::back_inserter(buffer));
}
于 2011-03-24T19:13:11.220 に答える
0

最善の答えは、ファイルを希望どおりに解析する独自のイテレータのペアを作成することだと思います。入力が値の間に少なくとも1つのスペースを入れてフォーマットされていれば 、同じイテレータに変更std::vector<char>して使用できます。std::vector<float>streambuf

于 2011-03-24T19:03:24.103 に答える