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



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

问题是,当我"提取"它并将其粘贴到图像文件中时,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();

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

一种使用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;  

已解决。该问题是在打开前保存文件的流操作期间出现的。因为文件是以文本形式保存的(使用CR LF),所以它也是以文本形式打开的。

相关内容

  • 没有找到相关文章

最新更新