web-dev-qa-db-ja.com

バイナリファイルの読み取りと書き込み

バイナリファイルをバッファに読み込むコードを記述してから、バッファを別のファイルに書き込もうとしています。次のコードがありますが、バッファにはファイルの最初の行からのASCII文字が2つだけ格納され、それ以外は何も格納されません。

int length;
char * buffer;

ifstream is;
is.open ("C:\\Final.gif", ios::binary );
// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);
// allocate memory:
buffer = new char [length];
// read data as a block:
is.read (buffer,length);
is.close();

FILE *pFile;
pFile = fopen ("C:\\myfile.gif", "w");
fwrite (buffer , 1 , sizeof(buffer) , pFile );
87
nf313743

これをC++の方法で行いたい場合は、次のようにします。

#include <fstream>
#include <iterator>
#include <algorithm>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );
    std::ofstream output( "C:\\myfile.gif", std::ios::binary );

    std::copy( 
        std::istreambuf_iterator<char>(input), 
        std::istreambuf_iterator<char>( ),
        std::ostreambuf_iterator<char>(output));
}

バッファ内のデータを変更する必要がある場合は、次を実行します。

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "C:\\Final.gif", std::ios::binary );

    // copies all data into buffer
    std::vector<unsigned char> buffer(std::istreambuf_iterator<char>(input), {});

}
156
Björn Pollex

以下に、rdbufを使用したC++の簡単な例を示します。これはウェブから入手しました。これで元のソースが見つかりません。

#include <fstream>
#include <iostream>

int main () 
{
  std::ifstream f1 ("C:\\me.txt",std::fstream::binary);

  std::ofstream f2 ("C:\\me2.doc",std::fstream::trunc|std::fstream::binary);

  f2<<f1.rdbuf();

  return 0;
}
13
Thomas Matthews
 sizeof(buffer) == sizeof(char*) 

代わりに長さを使用してください。

また、fopenを "wb"と一緒に使用することをお勧めします。

13

sizeof(buffer)は、実際のバッファーのサイズではなく、最終行のポインターのサイズです。代わりに、すでに確立した「長さ」を使用する必要があります

6
jcoder

Sizeof(buffer)の代わりに、fwriteに長さを渡す必要があります。

4
retrodrone

もっと簡単な方法があります。バイナリファイルかテキストファイルかは関係ありません。

Noskipwsを使用します。

char buf[SZ];
ifstream f("file");
int i;
for(i=0; f >> noskipws >> buffer[i]; i++);
ofstream f2("writeto");
for(int j=0; j < i; j++) f2 << noskipws << buffer[j];
0
Zeta