0

整数のバイナリファイルをintベクトルに読み込みました。並べ替え関数を使用すると、ベクトルはゼロになります。

私はベクトルがOKであることを知っています!

何が間違っている可能性がありますか?

std::ifstream input("D:\\Amostra.txt", ios::binary);
vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int));

input.read(reinterpret_cast<char *>(&v[0]), NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int));


sort(v.begin(), v.end());

for (int i=0; i<ELEMENTS_PER_BLOCK*NumBlocks; i++){
        cout << v[i] << endl;
    };
system("pause");
4

2 に答える 2

12
vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int));

そのコンストラクターへの引数は、必要な要素の数であり、それらの要素が取るバイト数ではありません。sizeof(int)*Nこれにより要素が作成されます。ここNで、は必要な数です。ソート後、最初(sizeof(int)-1)*Nは0になります。

input.read(reinterpret_cast<char *>(&v[0]), NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int));

ファイルには.txt拡張子が付いていますが、バイナリのように読み取っています。ファイルがバイナリダンプの場合、この読み取りは...まあ...コードの臭いですが、完全に間違っているわけではありません。ファイルがテキストの場合、これは完全に間違っています。

copyアルゴリズムとistream_iterator:を使用して、スペースで区切られた整数のみを含むテキストファイルを読み取ることができます。

std::vector<int> v;
v.reserve(NumBlocks*ELEMENTS_PER_BLOCK);
std::copy( std::istream_iterator<int>(input), std::istream_iterator<int>(),
           std::back_inserter( v ) );
于 2012-06-27T20:23:40.057 に答える
3

エラーは次の行にあります:

vector<int> v (NumBlocks*ELEMENTS_PER_BLOCK*sizeof(int));

*sizeof(int)引数はバイト数ではなく要素数でなければならないので、最後からを取り出してください。現状では、ベクトルには必要な数の4倍の要素があります。まだ読み込んでいないものはすべてゼロなので、を呼び出すとsort、ベクトルの先頭に移動し、実際のデータを含むものではなく、ゼロのものだけを出力します。

于 2012-06-27T20:24:10.627 に答える