读写二进制文件

nf3*_*743 94 c++ binary buffer file

我正在尝试编写代码将二进制文件读入缓冲区,然后将缓冲区写入另一个文件.我有以下代码,但缓冲区只存储文件中第一行的几个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 );
Run Code Online (Sandbox Code Playgroud)

Bjö*_*lex 161

如果你想用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));
}
Run Code Online (Sandbox Code Playgroud)

如果您需要缓冲区中的数据来修改它或其他内容,请执行以下操作:

#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), {});

}
Run Code Online (Sandbox Code Playgroud)

  • @Mikhail [Here](http://insanecoding.blogspot.it/2011/11/how-to-read-in-file-in-c.html)你可以找到一些基准测试. (8认同)
  • 如果我只想复制某些数据段来缓冲,该怎么办?我怎么能这样做?比方说1024字节. (3认同)
  • AFAIK,二进制文件有时包含不可读的字符,事实上,它们根本不是字符。此代码对于读取非文本基本文件是否安全?我的知识在这个范围内很短:) (3认同)
  • 所谓的“ char”在C / C ++中用于存储字节(已经使用了40年)。只要您不尝试将这些数据实际“使用”为字符(不要在其上使用strlen(),不要将其打印到控制台等),这样做是安全的。c ++ 17为此引入了`std :: byte`(实际上仍然是char实际上是`char`的伪装) (2认同)
  • @DavidTran 不知道更多就不能说-这似乎您应该创建一个重现问题的最小示例,然后发布问题。 (2认同)

小智 14

 sizeof(buffer) == sizeof(char*) 
Run Code Online (Sandbox Code Playgroud)

请改用长度.

另外,最好使用fopen" wb"....


Tho*_*ews 14

这是一个简短的例子,使用C++方式rdbuf.我从网上得到了这个.我找不到我原来的来源:

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • <fstream.h>?<iostream.h>?没有命名空间?这是什么,九十年代? (12认同)
  • 最好的,非便携式的方法是让操作系统复制您的文件.毕竟,这是它为生活所做的一部分; 不需要*重新发明轮子*. (8认同)

jco*_*der 7

sizeof(缓冲区)是最后一行上指针的大小而不是缓冲区的实际大小.您需要使用已经建立的"长度"


ret*_*one 5

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