1

我正在修改二进制数据的读取例程。不幸的是,我在 C++ 方面不再那么坚定了,这是编写例程所用的语言。例程开始读取一些数据。之后,我希望它查看我也从文件中读取的缓冲值。根据值,代码应该做某事并在之后正常继续,或者撤消读取缓冲区并正常继续。

我的问题是撤消或恢复光标位置,如果你愿意的话。剥离的代码如下所示:

int buffer;

std::fstream inputFile;
inputFile.open( "Filename", std::ios::in | std::ios::binary );

... // read some data from inputFile

// read buffer value
inputFile.read( reinterpret_cast<char *>(&buffer), sizeof(buffer) );

if( buffer == 256 ) {
    ... // do something here
} else
    // make it so nothing (including reading the buffer earlier) happened
    inputFile.seekg( -1*sizeof(buffer), std::ios::cur ); // <---- is this right?
    // or do I need to do it this way?
    inputFile.seekg( -1*sizeof(buffer)/sizeof(char), std::ios:cur );
}

我假设我可以在 int 中使用负值,seekg()因为我发现 int 只是逻辑上的并且没有读到任何相反的东西。以上哪种方式是正确的?或者基本上我在问第一个论点实际上期望什么?seekg()

C++ 参考仅说明了这一点:

istream& seekg (streamoff off, ios_base::seekdir 方式);
 离开
    偏移值,相对于方式参数。
    streamoff 是一个偏移类型(通常是有符号整数类型)。
 方式
    ios_base::seekdir 类型的对象。它可以采用以下任何常量值:
    值偏移量是相对于...
    ios_base::beg 流的开始
    ios_base::cur 当前在流中的位置
    ios_base::end 流结束

哪个没有告诉我单位off是用(字节,字符,整数?)来衡量的。

4

1 回答 1

1

seekg()采用参数的版本whence采用std::streamoffas 参数。它可以是负面的。没有必要除以sizeof(char)定义sizeof(char)1。由于流 aleay 对字符进行操作,因此流使用的单位是字符,即流的第一个模板参数的类型。

于 2013-10-11T12:11:06.650 回答