我需要将jpg文件读取为字符串。我想将此文件上传到我们的服务器,我只是发现API需要一个字符串作为此图片的数据。我按照前一个问题提出的建议,我已经问Upload pics to a server using c++。
int main() {
ifstream fin("cloud.jpg");
ofstream fout("test.jpg");//for testing purpose, to see if the string is a right copy
ostringstream ostrm;
unsigned char tmp;
int count = 0;
while ( fin >> tmp ) {
++count;//for testing purpose
ostrm << tmp;
}
string data( ostrm.str() );
cout << count << endl;//ouput 60! Definitely not the right size
fout << string;//only 60 bytes
return 0;
}
为什么它会在60点停止? 60岁时这是一个奇怪的角色,我该怎么做才能将jpg读成一个字符串?
更新
几乎存在,但在使用建议的方法后,当我将字符串重写为输出文件时,它会失真。发现我还应该通过ofstream::binary
指定ofstream处于二进制模式。完成!
顺便说一句,ifstream::binary
&amp; ios::binary
,是ofstream::binary
的缩写吗?
答案 0 :(得分:17)
以二进制模式打开文件,否则会产生有趣的行为,并且会以不恰当的方式处理某些非文本字符,至少在Windows上是这样。
ifstream fin("cloud.jpg", ios::binary);
此外,您可以一次性读取整个文件,而不是while循环:
ostrm << fin.rdbuf();
答案 1 :(得分:7)
您不应该将文件读取为字符串,因为jpg包含值为0是合法的。但是在字符串中,值0具有特殊含义(它是字符串指示符的结尾,也就是\ 0) 。您应该将文件读入矢量。你可以这样轻松地做到这一点:
#include <algorithm>
#include <iostream>
#include <fstream>
#include <vector>
int main(int argc, char* argv[])
{
std::ifstream ifs("C:\\Users\\Borgleader\\Documents\\Rapptz.h");
if(!ifs)
{
return -1;
}
std::vector<char> data = std::vector<char>(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
//If you really need it in a string you can initialize it the same way as the vector
std::string data2 = std::string(std::istreambuf_iterator<char>(ifs), std::istreambuf_iterator<char>());
std::for_each(data.begin(), data.end(), [](char c) { std::cout << c; });
std::cin.get();
return 0;
}
答案 2 :(得分:6)
尝试以二进制模式打开文件:
ifstream fin("cloud.jpg", std::ios::binary);
猜测一下,你可能试图在Windows上读取文件而61 st 字符可能是0x26 - 一个控件-Z,它(在Windows上)将被视为标记文件的结尾。
就如何最好地进行阅读而言,最终会在简单性和速度之间做出选择,如a previous answer中所示。