C++ 使用ofstream保存文件 sgetn(缓冲区,长度);什么也不读。我重现了你的问题,并写下了解决问题的方法。很好的方法!考虑到ios::binary==ios_base::binary和ios_base::out==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();

C++ 使用ofstream保存文件 sgetn(缓冲区,长度);什么也不读。我重现了你的问题,并写下了解决问题的方法。很好的方法!考虑到ios::binary==ios_base::binary和ios_base::out==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();,c++,base64,ofstream,C++,Base64,Ofstream,“test2.jpg”与“test.jpg”(原始文件)的大小完全相同,但我无法打开它。 我找不到问题所在。显然,您的文件写入逻辑没有表面问题,尽管存在一些不规则之处。最大的问题在于你的主要逻辑 这个程序似乎是复制文件的简单程序。您要做的是读取文件,将其数据转换为base64字符串,然后再次将数据解码为std::string。现在有一个小问题。无法将base64字符串成功转换为以null结尾的ANSI字符串,原因很明显,已解码二进制数据中的任何0都会过早终止该字符串。其次,您正在以二进制模式打开

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

显然,您的文件写入逻辑没有表面问题,尽管存在一些不规则之处。最大的问题在于你的主要逻辑

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

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


看来你忘了写字了

inputFile.seekg (0, ios::beg);

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

我让它工作起来了。我刚刚替换了:

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


对代码的一些观察和一些反问题。您不能打开test2.jpg是什么意思?在文件浏览器中?为什么要以二进制模式打开test2.jpg,然后在文件中写入ANSI C字符串?使用文本模式可以很好地做到这一点。是的,我的意思是在文件资源管理器中。这是我之前在文件上写二进制数据的测试,我刚刚意识到。您正在将base64字符串再次解码为字符串!这是灾难性的。由于解码数据的二进制输出为零,您不知道字符串何时终止。此外,我不太确定在JPG文件中写入base64编码数据的结果。文件浏览器无法理解它。您的文件写入逻辑似乎没有任何问题。那么,我该怎么办?目的不是复制文件。这只是为了测试。主程序获取一个图像,将其转换为Base64并存储在数据库中,另一个程序读取此Base64数据并显示图像。我运行了另一个测试,“buffer”中的数据与“decodedData”中的数据完全相同是的,我同意base64通常用于存储数据或传输数据,但在这种情况下,您所做的是错误的。如果要将base64编码的数据写入文件,只需将该数据写入即可。不要破译和写它。这没有道理。此外,也不要期望文件资源管理器读取文件的base64编码数据并正确显示图像。另外,您如何比较“buffer”和“deocdedData”中的数据?通过打印还是将其等同?这两种方法都会给出错误的结果。你需要打印十六进制的数据来比较。我已经解码了它,发现我可以从中创建图像文件。正如我之前所说的,我只是在这里测试东西是的,但这不会引起任何问题你说的“不会引起任何问题”是什么意思?pbuf->sgetn(缓冲区,长度);什么也不读。我重现了你的问题,并写下了解决问题的方法。很好的方法!考虑到ios::binary==ios_base::binary和ios_base::out==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();