C++ 使用c++;

C++ 使用c++;,c++,file-upload,file-io,C++,File Upload,File Io,我需要将jpg文件读取为字符串。我想把这个文件上传到我们的服务器上,我刚刚发现API需要一个字符串作为这个pic的数据。我遵循了前一个问题中的建议 intmain(){ ifstream fin(“cloud.jpg”); ofstream fout(“test.jpg”);//出于测试目的,查看字符串是否是正确的副本 ostringstream-ostrm; 无符号字符tmp; 整数计数=0; 而(fin>>tmp){ ++count;//用于测试目的 ostrm您不应该将文件读入字符串,因为

我需要将jpg文件读取为字符串。我想把这个文件上传到我们的服务器上,我刚刚发现API需要一个字符串作为这个pic的数据。我遵循了前一个问题中的建议

intmain(){
ifstream fin(“cloud.jpg”);
ofstream fout(“test.jpg”);//出于测试目的,查看字符串是否是正确的副本
ostringstream-ostrm;
无符号字符tmp;
整数计数=0;
而(fin>>tmp){
++count;//用于测试目的

ostrm您不应该将文件读入字符串,因为jpg包含0的值是合法的。但是,在字符串中,值0有一个特殊的含义(它是字符串末尾指示符aka\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;
}
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
std::ifstream ifs(“C:\\Users\\Borgleader\\Documents\\Rapptz.h”);
如果(!ifs)
{
返回-1;
}
std::vector data=std::vector(std::istreambuf_迭代器(ifs),std::istreambuf_迭代器());
//如果你真的需要它在一个字符串中,你可以像向量一样初始化它
std::string data2=std::string(std::istreambuf_迭代器(ifs),std::istreambuf_迭代器());

std::for_each(data.begin()、data.end()、[](char c){std::cout以二进制模式打开文件,否则它将有有趣的行为,并且它将以不适当的方式处理某些非文本字符,至少在Windows上是这样

ifstream fin("cloud.jpg", ios::binary);
此外,您可以一次读取整个文件,而不是while循环:

ostrm << fin.rdbuf();

ostm尝试以二进制模式打开文件:

ifstream fin("cloud.jpg", std::ios::binary);
猜测一下,您可能正在尝试在Windows上读取文件,第61个字符可能是0x26——一个控件-Z,它(在Windows上)将被视为标记文件的结尾


至于如何最好地进行读取,您最终需要在简单性和速度之间进行选择,如中所示。

虽然C样式的字符串不能包含
\0
,但是
std::string
可以(尽管您基本上是对的--
std::string
对于二进制数据来说确实不是正确的选择)@JerryCoffin,但api需要一个字符串:
const string&data:要上传的照片的原始数据
@zoujyjs我编辑了代码示例,以包括如何初始化字符串。它的工作方式与向量相同。@zoujyjs:你可能没有选择,如果是这样的话,这就是生活。未来仍需要记住一些东西(至少在我看来)。在
ifstream::binary
ios::binary
之间没有区别,甚至在
ios\u base
类中定义了
binary
,它是所有iostream类的根。
ios
basic\u ios
的类型定义,它是介于
io>之间的类在层次结构中,s_base
istream
/
ostream
。我倾向于使用它,因为它很容易键入。你可以对
ifstream
流的
使用
ifstream::binary
。你甚至可以对
流的
使用
ifstream::binary
,反之亦然。
ifstream fin("cloud.jpg", std::ios::binary);