读写二进制文件

我尝试编写代码将二进制文件读入缓冲区,然后将缓冲区写入另一个文件。我有以下代码,但是缓冲区只存储文件中第一行的几个 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 );
375691 次浏览

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

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

 sizeof(buffer) == sizeof(char*)

用长度代替。

此外,最好使用 fopen与“ wb”... 。

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


}

下面是一个简短的例子,使用 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;
}

可以通过下面的代码片段中的简单命令来完成。

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

只要用这个。测试和工作! !

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

有一个较小的缓冲区大小将有助于复制小文件 就能完成任务。

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

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

通常流跳过空白字符,如空格或新行、制表符和所有其他控制字符。 但是诺斯基普斯把所有的角色都转移了。 因此,这不仅会复制一个文本文件,而且还会复制一个二进制文件。 并且流内部使用缓冲,我假设速度不会很慢。

下面是使用 向量元组读写 Text,Binary and Hex files的标准 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();
}
}

}

完整的源代码可以找到 给你