1

重複の可能性:
eof の読み取り時に failbit が設定されるのはなぜですか? 抜け道はありますか?

私は小さなプログラムを書いていますが、Mac OS と Ubuntu (Unix...) で見事に動作していました。プログラムは、データ ファイルを読み込み、バイト ( chars / unsigned chars) とmemcpy()それらを float に分離する必要があります。これには、たとえば次の 4 つの値を取得し、それらを読み取って 32 ビットに左シフトし、 s メモリを a にintコピーするプロセスが含まれます。そのようです:intfloat

0x43 0x66 0x1A 0x79 -> int32 と memcpy() を float に読み込む -> val = 230.103

前述したように、これは Unix では問題なく動作しますが、Windowschar 0x1Aはファイルの終わり (EOF) エラーを解釈し、データの読み取りを停止するようです。Windows がそのようなことを行い、Unix ではないのはなぜですか? どうすればオフにできますか?

ifstreamそれ自体を見て、EOLフラグが設定されているかどうかを確認して、エラー処理を試みました。次にclear()ifstreamのエラーフラグを読み続けます(を使用get())が、いまいましいことは常に同じ EOF /0x1A文字を返し、次の文字を読みません。

編集:いくつかのコードを追加


ifstream input (PATH, ios::in);
if (input.is_open()) {
  unsigned int counter = 0;
  while (input.good()) {
    BYTE byte;
    byte = input.get();
    printf("%i, ", byte);
    counter++;
  }
  printf("\r%i, ", counter);
  input.close();
} else {
  printf("Can't open file!");
}

どんな助けでも大歓迎です。

マックス

4

2 に答える 2

6

ではifstream input (PATH, ios::in);、(デフォルトの) テキスト モードでファイルを開きます。ファイルがテキスト モードで開かれると、標準ライブラリは、ファイルから読み取られたデータに対してプラットフォーム固有の変換を実行し、テキスト ファイルのプラットフォームのネイティブ形式を、C (および C++) がテキスト ファイルに対して持つビューにマップします。

Unix ライクなシステム (Mac OSX および Linux を含む) の場合、ネイティブ テキスト形式は C および C++ によるテキストの表示方法と同じであるため、変換は必要ありません。

Windows プラットフォームでは、行末を変換する必要があり ('\n'は文字シーケンスとの間で変換されますCR LF)、Windows が定義する EOF 文字 ( 1A) を解釈する必要があります。

他のシステムでは、より大規模な変換が必要になる場合があります (たとえば、テキスト ファイルが正確に 80 文字のスペースで埋められた行として指定されている場合、実装は'\n'80 文字を読み取った後に文字自体を生成する必要があり、それを抑制する可能性があります)。行の末尾のスペース文字)。

于 2012-11-27T11:52:59.190 に答える
1

ios::binary フラグを使用:

#include <iostream>
#include <fstream>
#include <windows.h>

int main()
{

    std::ifstream input ("msg.txt",  std::ios::binary );
    if (input.is_open())
    {
        unsigned int counter = 0;
        while (input.good()) 
        {
            BYTE byte;
            byte = input.get();
            printf("%d : %d \n", counter,  byte);
            counter++;
        }

        input.close();
    }
}

入力データ:0x43 0x66 0x1A 0x79 0x68 0xAc

出力:

0 : 48 
1 : 120 
2 : 52 
3 : 51 
4 : 32 
5 : 48 
6 : 120 
7 : 54 
8 : 54 
9 : 32 
10 : 48 
11 : 120 
12 : 49 
13 : 65 
14 : 32 
15 : 48 
16 : 120 
17 : 55 
18 : 57 
19 : 32 
20 : 48 
21 : 120 
22 : 54 
23 : 56 
24 : 32 
25 : 48 
26 : 120 
27 : 65 
28 : 99 
29 : 32 
30 : 255

この例では、データは 1 文字ずつ読み取られますが、 を使用してユース ケースに適応させることができますifstream.read(buffer, buffersize)

ちなみに、このプログラムは Windows7 で gcc でコンパイルしたものです。

于 2012-11-27T11:36:42.450 に答える