2

私は C++ を学習しており、バイナリ モードでファイルを読み取る必要があります。これが私のやり方です(C++リファレンスに従って):

unsigned values[255];
unsigned total;
ifstream in ("test.txt", ifstream::binary);

while(in.good()){
    unsigned val = in.get();
    if(in.good()){
        values[val]++;
        total++;
        cout << val <<endl;
    }
}

in.close();

だから、私はバイトごとにファイルバイトを読んでいますin.good()。何が起こっているのかを理解するためにcout、最後にいくつかを追加しました。出力は次のとおりです。while

marco@iceland:~/workspace/huffman$ ./main 
97
97
97
97
10
98
98
10
99
99
99
99
10
100
100
10
101
101
10
221497852
marco@iceland:~/workspace/huffman$

さて、入力ファイル「test.txt」は次のとおりです。

aaaa
bb
cccc
dd
ee

そのため、221497852 がある最後まですべてが完全に機能します。ファイルの終わりに関するものだと思いますが、問題を理解できません。

Debian マシン (64 ビット) で gedit & g++ を使用しています。ヘルプヘルプをいただければ幸いです。

どうもありがとう、

マルコ

4

3 に答える 3

4

fstream::get値を返しますint。これが問題の 1 つです。

第二に、バイナリで読んでいるので、フォーマットされたストリームを使用しないでください。使用する必要がありますfstream::read

// read a file into memory
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main () {

  std::ifstream is ("test.txt", std::ifstream::binary);
  if (is) {
    // get length of file:
    is.seekg (0, is.end);
    int length = is.tellg();
    is.seekg (0, is.beg);

    char * buffer = new char [length];

    std::cout << "Reading " << length << " characters... ";
    // read data as a block:
    is.read (buffer,length);

    if (is)
      std::cout << "all characters read successfully.";
    else
      std::cout << "error: only " << is.gcount() << " could be read";
    is.close();

    // ...buffer contains the entire file...

    delete[] buffer;
  }
  return 0;
}
于 2013-05-08T07:48:36.180 に答える
-1

私は最終的にこれを理解しました。どうやら問題はコードによるものではないようです。問題は gedit でした。ファイルの最後に常に改行文字を追加します。これは、vim などの他のエディターでも発生します。一部のエディターでは、何も追加しないように構成できますが、gedit では明らかに不可能です。https://askubuntu.com/questions/13317/how-to-stop-gedit-gvim-vim-nano-from-adding-end-of-file-newline-char

私に質問してくれた皆さん、乾杯。

マルコ

于 2013-05-08T17:04:54.800 に答える