对于一个学校项目,我们在某个函数中从一个 BMP 格式的二进制文件中读取像素。 pixels 是来自对象的 Pixel 类型的二维数组。这里的目标是从二进制文件中读取 X 行和 Y 列像素。然而,在每行像素之后有一些填充,可以使用函数 calculatePadding() 计算,该函数的返回类型为 unsigned。
我们要做的是以二进制形式逐行读取文件并跳过每一行之后的填充,因为我们将像素存储在另一个变量中。这是我到目前为止所做的:
for (int i = image.height - 1; i >= 0; i--) {
for (unsigned j = 0;j < image.width; j++) {
file.read((char*)&image.pixels[i][j], sizeof(Pixel));
}
fichier.seekg(sizeof(calculatePadding(image)) + tellp() , ios::beg);
}
我的问题是最后一行(在最后一个右括号之前)。我知道我必须通过添加光标的当前位置和填充所需的任何大小来向前设置光标。但是,如何添加 unsigned 和 streampos?我不明白我应该进行什么转换。我们不允许使用 ignore()
感谢您的帮助!
另外,附带说明一下,如何将“0”写入二进制文件?在下一个函数中,我必须拍摄图像并将其写入二进制文件,然后将“0”放入有填充的二进制文件中。
这有用吗?
int zero = 0;
file.write((char*)&zero, sizeof(calculatePadding(image)));
最佳答案
afaik 没有可移植的方法来求和/减去 streampos 和数字。 但可以通过两个步骤实现相同的目的: 1. 设置相对于开头的位置(使用 streampos) 2. 设置相对于当前位置的位置(带无符号)
std::ofstream ofs;
ofs.open("out.txt");
ofs<<"test string\n";
auto opos = ofs.tellp();
std::ifstream ifs;
ifs.open("in.txt");
ifs.seekg(opos, std::ios::beg);
ifs.seekg(10/* your additional offset*/, std::ios::cur);
另一种可能性 - 将 streampos 与 streamoff 相加
ifs.seekg(opos + std::streamoff(10/* your additional offset*/), std::ios::beg);
大约0。你可以使用put/write方法写入一个或几个字节(字符)。你的方法不正确。您只有 sizeof(int) 零,但您正在尝试使用可以更大的大小。 有一个类似的问题 - How to write 'n' copies of a character to ostream like in python
关于c++ - 在不使用 ignore() 的情况下读取二进制文件(C++)时忽略 N 个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47380456/