读写二进制文件

问题描述 投票:0回答:8

我正在尝试编写代码将二进制文件读入缓冲区,然后将缓冲区写入另一个文件。我有以下代码,但缓冲区仅存储文件第一行中的几个 ASCII 字符,没有其他内容。

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 );
c++ file binary buffer
8个回答
243
投票

如果您想以 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), {});

}

17
投票

这是一个简短的示例,使用

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;
}

15
投票
 sizeof(buffer) == sizeof(char*) 

使用长度代替。

另外,最好将

fopen
与“
wb
”一起使用....


10
投票

sizeof(buffer) 是最后一行上指针的大小,而不是缓冲区的实际大小。 您需要使用已经建立的“长度”来代替


6
投票

您应该将 length 传递给 fwrite 而不是 sizeof(buffer)。


5
投票

这里是使用向量元组来读写文本、二进制和十六进制文件的标准C++ 14的实现。

代码片段:

try {
    if (file_type == BINARY_FILE) {

        /*Open the stream in binary mode.*/
        std::ifstream bin_file(file_name, std::ios::binary);

        if (bin_file.good()) {
            /*Read Binary data using streambuffer iterators.*/
            std::vector<uint8_t> v_buf((std::istreambuf_iterator<char>(bin_file)), (std::istreambuf_iterator<char>()));
            vec_buf = v_buf;
            bin_file.close();
        }

        else {
            throw std::exception();
        }

    }

    else if (file_type == ASCII_FILE) {

        /*Open the stream in default mode.*/
        std::ifstream ascii_file(file_name);
        string ascii_data;

        if (ascii_file.good()) {
            /*Read ASCII data using getline*/
            while (getline(ascii_file, ascii_data))
                str_buf += ascii_data + "\n";

            ascii_file.close();
        }
        else {
            throw std::exception();
        }
    }

    else if (file_type == HEX_FILE) {

        /*Open the stream in default mode.*/
        std::ifstream hex_file(file_name);

        if (hex_file.good()) {
            /*Read Hex data using streambuffer iterators.*/
            std::vector<char> h_buf((std::istreambuf_iterator<char>(hex_file)), (std::istreambuf_iterator<char>()));
            string hex_str_buf(h_buf.begin(), h_buf.end());
            hex_buf = hex_str_buf;

            hex_file.close();
        }
        else {
            throw std::exception();
        }
    }

}

完整源代码可以在这里

找到

0
投票

可以使用以下代码片段中的简单命令来完成。

复制任意大小的整个文件。没有尺寸限制!

就用这个吧。已测试并工作!!

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
  ifstream infile;
  infile.open("source.pdf",ios::binary|ios::in);

  ofstream outfile;
  outfile.open("temppdf.pdf",ios::binary|ios::out);

  int buffer[2];
  while(infile.read((char *)&buffer,sizeof(buffer)))
  {
      outfile.write((char *)&buffer,sizeof(buffer));
  }

  infile.close();
  outfile.close();
  return 0;
}

较小的缓冲区大小有助于复制小文件。甚至“字符缓冲区[2]” 会完成这项工作。


-2
投票

有一个更简单的方法。这并不关心它是二进制文件还是文本文件。

使用 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];

或者你可以只使用字符串而不是缓冲区。

string s; char c;
ifstream f("image.jpg");
while(f >> noskipws >> c) s += c;
ofstream f2("copy.jpg");
f2 << s;

通常流会跳过空白字符,例如空格或换行符、制表符和所有其他控制字符。 但 noskipws 使所有字符都转移。 因此,这不仅会复制文本文件,还会复制二进制文件。 而且stream内部使用了buffer,我想速度不会慢。

© www.soinside.com 2019 - 2024. All rights reserved.