使用c ++将二进制文件(jpg)读取为字符串

时间:2013-07-11 03:56:21

标签: c++ file-upload file-io

我需要将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的缩写吗?

3 个答案:

答案 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中所示。