从istream中读取后,如何将光标设置回预读位置?

时间:2013-10-11 12:02:23

标签: c++ parameters fstream seekg

我正在修改二进制数据的阅读例程。不幸的是,我在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只是逻辑1而没有读到任何相反的东西。 以上哪种方式是正确的?或者基本上我是在问 seekg()实际上期望的第一个参数是什么?

C++ Reference只说了这个:

 istream& seekg (streamoff off, ios_base::seekdir way);
 off
    Offset value, relative to the way parameter.
    streamoff is an offset type (generally, a signed integral type).
 way
    Object of type ios_base::seekdir. It may take any of the following constant values:
    value   offset is relative to...
    ios_base::beg   beginning of the stream
    ios_base::cur   current position in the stream
    ios_base::end   end of the stream

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

1 个答案:

答案 0 :(得分:1)

采用seekg()参数的whence版本需要std::streamoff作为参数。这可能是消极的。由于sizeof(char)被定义为sizeof(char),因此无需除以1。由于stream aleays对字符进行操作,因此stream使用的单位是字符,即流的第一个模板参数的类型。