用ofstream保存文件

saving file with ofstream

本文关键字:保存文件 ofstream      更新时间:2023-10-16

我是c++的新手,我有一个名为"test.jpg"的图像,我将其转换为base64并再次解码,像这样:

std::ifstream  inputFile;
inputFile.open("test.jpg",std::ios::binary);
std::filebuf* pbuf = inputFile.rdbuf();
inputFile.seekg (0, ios::end);
int length = inputFile.tellg();
// allocate memory to contain file data
 char* buffer=new char[length];
// get file data
pbuf->sgetn (buffer,length);
inputFile.close();
CBase64 base64;
string encodedData = base64.base64_encode((unsigned char*)buffer,length);
delete[] buffer;
string decodedData = base64.base64_decode(encodedData);
ofstream outPutFile;
outPutFile.open("test2.jpg",ios::binary | ios::out);
outPutFile.write(decodedData.c_str(), decodedData.length());
outPutFile.close();

"test2.jpg"与"test.jpg"(原始文件)的大小完全相同,但是,我无法打开它。我找不到问题所在。

我搞定了。我只是替换了:

outPutFile.open("test2.jpg",ios::binary | ios::out);

outPutFile.open("test2.jpg", ios_base::out | ios_base::binary);
std::string path = "file.txt";
std::string cfgString = "data";
std::ofstream output(path.c_str(), ios_base::out | std::ios::binary);
if (output.is_open()) {
    output.write(cfgString.data(), cfgString.length());
}
output.close();

显然,您的文件写入逻辑没有表面上的问题,尽管存在一些不正常的情况。最大的问题在于你的主逻辑。

这个程序看起来是一个简单的复制文件程序。您正在做的是读取一个文件,将其数据转换为base64字符串,然后再次解码数据为std::string。现在有一个小问题。不能成功地将base64字符串转换为以空结尾的ANSI字符串,原因很明显,解码的二进制数据中的任何0都会过早地终止字符串。其次,您以二进制模式打开文件以写入,但试图在文件中写入std::string。但这并不重要,因为您的数据已经在之前的操作中损坏了。

要解决这个问题,你可以简单地使用文件复制的例子,或者确保只小心地将二进制数据写入输出文件,这意味着从输入文件中读取二进制数据,并将相同的缓冲区写入输出文件。不需要base64编码解码。

你好像忘了写

inputFile.seekg (0, ios::beg);
获取文件长度后的

。这意味着您尝试从文件的末尾而不是开始读取。