【问题标题】:After reading from an fstream how do I set the curor back to pre-read position?从 istream 读取后,如何将光标设置回预读位置?
【发布时间】:2013-10-19 12:09:10
【问题描述】:

我正在修改二进制数据的读取例程。不幸的是,我在 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++ Reference 只这么说:

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

这不告诉我单位 off 以(字节、字符、整数?)为单位。

【问题讨论】:

  • 对我来说两者都很好,sizeof(char) 总是等于 1,负偏移是可以的。唯一让我感到困惑的是sizeof(buffer1) vs sizeof(buffer)
  • 记住你在阅读之前的位置tellg
  • 好的,谢谢。变量bufferbuffer1 应该是相同的。我刚刚添加了一个错字,我刚刚更正了。你的眼光不错!

标签: c++ parameters fstream seekg


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多