3

istream::seekgの奇妙な振る舞いだと思います。具体的には、ファイルの終わりから明らかに離れたポイントを探したときに、フェイルビットが設定されていないように見えます。

ドキュメントでわかることから、フェイルビットを設定する必要がありますが、そうではありません。

誰かがこの行動を説明できますか?関連するコードのスニペット:

class Tester 
{

  ... 

  void testTriggered()
  {
    fs.open("/pathtofile/testFile.TEST", std::ios_base::in|std::ios_base::binary);
    prv_testbits("testTriggered(): OpeningFile");

    fs.seekg(2000,std::ios_base::beg);
    prv_testbits("testTriggered(): seekTwoThousand");
    int g = fs.tellg();
    std::cout << "get pointer is:" << g << std::endl; 
  }

  void prv_testbits(std::string msg){
    if (fs.fail()) {
      std::cout << msg << ": failbit set." << std::endl;
    } else {
      std::cout << msg << ": failbit NOT set." << std::endl;
    }
    if (fs.bad()) {
      std::cout << msg << ": badbit set." << std::endl;
    }else {
      std::cout << msg << ": badbit NOT set." << std::endl;
    }
    if (fs.eof()) {
      std::cout << msg << ": eofbit set." << std::endl;
    } else {
      std::cout << msg << ": eofbit NOT set." << std::endl;
    }
  }

   ....

 private:
  std::ifstream fs;
}; 

入力ファイルは20バイトで構成されています:0123456789abcdefghij

サンプル実行の出力:

testTriggered(): OpeningFile: failbit NOT set.
testTriggered(): OpeningFile: badbit NOT set.
testTriggered(): OpeningFile: eofbit NOT set.
testTriggered(): seekTwoThousand: failbit NOT set.
testTriggered(): seekTwoThousand: badbit NOT set.
testTriggered(): seekTwoThousand: eofbit NOT set.
get pointer is:2000

g ++バージョン情報:$ g++-v組み込み仕様を使用します。ターゲット:x86_64-linux-gnu構成:../ src / configure -v --with-pkgversion ='Ubuntu 4.4.3-4ubuntu5' -with-gxx-include-dir = / usr / include / c ++ / 4.4 [ snip] gccバージョン4.4.3(Ubuntu 4.4.3-4ubuntu5)

$ uname -a Linux hostx 2.6.32-36-server#79-Ubuntu SMP Tue Nov 8 22:44:38 UTC 2011 x86_64 GNU / Linux

4

1 に答える 1

4

の Open Group 仕様fseek()( の実装に使用される可能性が高いfstream::seekg) は、現在のファイルの終わりを超えるファイル位置を許可するために必要です。

fseek()関数を使用すると、ファイル位置インジケータをファイル内の既存のデータの末尾を超えて設定できます。この時点でデータが後で書き込まれる場合、ギャップ内のデータの後続の読み取りは、データが実際にギャップに書き込まれるまで、値 0 のバイトを返します。

http://pubs.opengroup.org/onlinepubs/009696699/functions/fseek.html

于 2012-06-13T21:57:25.237 に答える