0

こんにちは、これは少し初心者に見えるかもしれませんが、ここに行きます。インターネットから特定のゲームのリーダーボードをダウンロードし、それを適切な形式 (精巧なランキングなど) に変換するプログラムを開発しています。

ファイルにはランク順に並べられた名前が含まれていますが、各名前の間には 7 つのランダムな制御コードがあります(明らかに印刷できません)。txt ファイルは次のようになります。

..C...hName1..)...&Name2......)Name3..é...þName4..Ü...†Name5..'...QName6..~... bName7..H...NName8..|....Name9..v...HName10.

hexEditor で確認したところ、各名前の後の最初の制御コードは常に null 文字 ( 0x00 ) でした。だから、私はすべてを読んでから、すべての文字を数えます。0x00 文字が見つかった場合は、7文字をスキップして数え続けます。したがって、あなたはリストで終わりますよね?

最初は、これらのランダムな制御コードで、「ソフト EOF」( 0x1A )のようなものを見つけることがあり、プログラムがそこで読み取りを停止するという問題がありました。それで、最終的にバイナリモードで開くことにしました。それは機能し、その後、すべてがカウントされます...またはそれが私が思ったことです。

しかし、まだ機能しない別のファイルに出くわし、最終的にEOF文字があることがわかりました! ( 0x0A ) バイナリ モードで開いているので意味がありません。それでも、その文字を読み取った後、C++ はそれを新しいファイルとして解釈するため、7 文字をスキップするため、その文字の後の名前は常にカットされて表示されます。

これが私の現在のコードです:

#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;


int main () {
  string scores;
  system("wget http://certainwebsite/001.txt"); //download file
  ifstream highin ("001.txt", ios::binary);
  ofstream highout ("board.txt", ios::binary);
  if (highin.is_open())
  {
    while ( highin.good() )
    {
          getline (highin, scores);
          for (int i=0;i<scores.length(); i++)
          {
              if (scores[i]==0x00){
                 i=i+7; //skip 7 characters if 'null' is found
                 cout << endl;
                 highout << endl;
                 }
              cout << scores[i];
              highout << scores[i]; //cout names and save them in output file
          }
    }
    highin.close();
  }
  else cout << "Unable to open file";
  system("pause>nul");
}

既にバイナリ モードになっている場合、その文字を無視する方法がわかりません。長い質問で申し訳ありませんが、詳細かつ具体的にしたかったのです。この場合、EOF 文字は Name3 の前にあるため、出力は次のようになります: http://i.imgur.com/yu1NjoZ.png

4

3 に答える 3

1

あなたがそれを理解してくれてうれしいです.getline()が原因であったことは驚くことではありません. CSVファイルを読み込もうとしたときに、改行文字を扱う同様の問題がありました。関数の呼び出し方法に応じて、C++ にはいくつかの異なる getline() 関数があり、それぞれが改行文字の処理が異なるようです。

補足として、 for ループでは、テストでメソッド呼び出しを実行しないことをお勧めします。これにより、ループに不要なオーバーヘッドが追加されます。メソッドを一度呼び出してその値を変数に入れ、ループに入って長さ変数に対して i をテストする方がよいでしょう。長さが変わることが予想される場合を除き、反復ごとに length() メソッドを呼び出すと、システム リソースが無駄になります。

于 2013-05-27T02:57:54.577 に答える
0

皆さんありがとうございました。うまくいきました。実際に問題を引き起こしたのは getline() でした。「while」ループが原因で、改行文字が見つかるたびにプロセスが再起動され、その 7 文字がスキップされました。

于 2013-05-27T02:04:46.653 に答える