我正在修改二进制数据的读取例程。不幸的是,我对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 );
}
我假设我可以在seekg()
中使用负值,因为我发现 int 只有逻辑所有并且没有阅读任何相反的内容。以上哪种方式是正确的?或者基本上我在问seekg()
实际上期望作为第一个论点是什么?
C++参考文献只说:
iStream&Seekg (Streamoff Off, ios_base::Seekdir Way); 关闭 相对于 way 参数的偏移值。 流关闭是一种偏移类型(通常是有符号整数类型)。 道路 类型为 ios_base::seekdir.它可以采用以下任何常量值: 值偏移量相对于... ios_base::乞求溪流的开头 ios_base::cur 流中的当前位置 ios_base::结束流的结束
这并没有告诉我off
的单位是用(字节、字符、整数?
seekg()
采用whence
参数的版本采用std::streamoff
作为参数。它可以是负面的。没有必要除以sizeof(char)
,因为sizeof(char)
被定义为1
。由于流 aleays 对字符进行操作,因此流使用的单元是字符,即流的第一个模板参数的类型。