我有一个包含混合数据的自定义文件。在文件的末尾有一个我想要检索的整个图像。
问题在于,当我提取'将它粘贴到图像文件中,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();
答案 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),因此它也以文本形式打开。