使用ofstream保存文件

时间:2015-08-10 08:53:11

标签: c++ base64 ofstream

我是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"(原始文件)的大小完全相同但是,我无法打开它。 我无法找到问题所在。

4 个答案:

答案 0 :(得分:1)

我得到了它的工作。我刚换了:

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

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

答案 1 :(得分:1)

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();

答案 2 :(得分:0)

显然,即使存在一些违规行为,您的文件编写逻辑也不存在表面问题。最大的问题在于你的主要逻辑。

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

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

答案 3 :(得分:0)

看起来你忘了写

g(x)
获取文件长度后

。这意味着你试图从文件的末尾而不是它的开头读取。