1

int配列をfstreamに書き込もうとしていますが、を呼び出すと例外が発生しますfstream.write

fstreamint配列をファイルに書き込むために使用できますか?

int main(int argc, char * argv[])
{
    fstream amostra("D:\\Amostra.txt", ios::out | ios::binary);
    const int total_elements_block = 1024;
    const int buffer_size  = total_elements_block;

    const int total_buffer = 10;

    int * buffer = new int [buffer_size];
    //for (int j=0; j<total_buffer; j++){
        for (int i =0; i<total_elements_block; i++){
            buffer[i] = i;
        }
        amostra.write((char *)(&buffer), total_elements_block*4);
    //}

    amostra.close();
    delete []buffer;

    return 0;
}
4

2 に答える 2

5

アドレスをバッファに正しく渡していない。

(char *)(&buffer)

newで割り当てられたメモリへのポイントにbuffer含まれるポインタを使用する代わりに、のアドレスを取得するようにコンパイラに指示します。bufferバッファ自体のアドレスを取得するには、次のように変更します。

(char *)(buffer)
于 2012-06-22T16:04:43.333 に答える
5

キャプテンオブビリアスはあなたの問題を診断するのに正しいです、しかし、ここで実際にいくつかの可能な修正があります。

彼の提案どおりに使用できます(char *)(buffer)が、私はこれにスタイル的に同意しません。

まず、Cスタイルのキャストを使用します。これはC++コードでは避ける必要があります。これにより、わずかに改善されたバージョンになりますreinterpret_cast<char *>(buffer)。これにより、removeのようなばかげたことをしないようにできますconst

ただ、それより少し上手くできると思います。ある時点で、プレーン配列が機能しないと判断する場合があります。std::arrayたぶん、C ++ 11 、またはに変更したいでしょうstd::vector。突然、コードが機能しなくなります。プレーンなCスタイルの配列は、私が最も頻繁に変更するデータ型です。このため、より似たものを検討することをお勧めしますreinterpret_cast<char *>(& buffer[0])

また、コードは移植性がないことに注意してください。をメモリに配置する方法は、int実装によって定義されます。C++プログラムでプログラム的にエンディアンを検出するなどの回答を見てください

于 2012-06-22T16:22:34.793 に答える