从混合数据文件中读取图像

时间:2014-04-24 16:26:12

标签: c++ file-io newline

我有一个包含混合数据的自定义文件。在文件的末尾有一个我想要检索的整个图像。

问题在于,当我提取'将它粘贴到图像文件中,rdbuf()给我留下了一些烦人的CR LF字符,而不仅仅是原版中的LF字符。

我已经以二进制模式打开了两个流。

using namespace std;

ifstream i(f, ios::in | ios::binary);
bool found = false;     // Found image name
string s;               // String to read to
string n = "";          // Image name to retrieve
while (!found) {
    getline(i, s);
    // Check if it's the name line
    if (s[0]=='-' && s[1]=='|' && s[2]=='-') {
        found = true;
        // Loop through name X: -|-XXXX-|-
        //                      0123456789
        //      Length: 10         3  6
        for (unsigned int j=3; j<s.length()-4; j++)
            n = n + s[j];
    }
}    
ofstream o(n.c_str(), ios::out | ios::binary);

o << i.rdbuf();

2 个答案:

答案 0 :(得分:0)

我做了一些研究,发现<<运算符将输入视为文本,因此在Windows上将\n调整为\r\n

使用write方法而不是<<来阻止此操作的方法。

你可以这样做(替换你的最后一行代码):

// get pointer to associated buffer object
std::filebuf* pbuf = i.rdbuf();
// next operations will calculate file size
// get current position
const std::size_t current = i.tellg();
// move to the end of file
i.seekg(0, i.end);
// get size of file (current position of the end)
std::size_t size = i.tellg();
// get size of remaining data (removing the current position from the size)
size -= current;
// move back to where we were
i.seekg(current, i.beg);
// allocate memory to contain image data
char* buffer=new char[size];
// get image data
pbuf->sgetn (buffer,size);
// close input stream
i.close();
// write buffer to output
o.write(buffer,size);
// free memory
delete[] buffer;  

答案 1 :(得分:0)

解决。问题是在流操作期间进行的,以便在打开之前保存文件。由于文件保存为文本(使用CR LF),因此它也以文本形式打开。