c++ - 在不使用 ignore() 的情况下读取二进制文件(C++)时忽略 N 个字节?

标签 c++ input stream binary binaryfiles

对于一个学校项目,我们在某个函数中从一个 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/

相关文章:

c++ - C++中的动态分配列表

c++ - 适用于 Windows 平台的 C/C++ 调用图实用程序

C# 在 Base64 中解码大型/巨大的 XML/CDATA 上下文

c# - 声音按钮不播放声音

java - Java中从BufferReader读取字符字段

java - 使用Java的FileInputStream

c++ - 什么会导致串行端口上的 CreateFile 调用极其缓慢?

c++ - 如果大于则无锁增量

Haskell 将用户输入存储在数组中

java - Android EditText 有固定的输入