1

トレントファイル(argv [1]を介して渡される)を開き、すべてを読み取り、ファイルの内容全体を変更せずにそのまま印刷する単純なC ++プログラムを作成しようとしています。オリジナルトレント。問題は、一部の torrent に日本語、ロシア語など (ファイル名、説明など) が含まれている可能性があることです...そしてもちろん、ハッシュなどを含む標準的な torrent データです。

これを行う最善の方法は何ですか?これまでのところ、コンテンツの一部しか出力されておらず、データを正しく読み取ったり印刷したりしていないようです...文字化けしているか何かです:

#include "stdafx.h" 
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

#if defined(UNICODE)
    #define _tcout wcout
#else
    #define _tcout cout
#endif

int _tmain(int argc, TCHAR* argv[])
{
    wifstream File(argv[1]);
    wstring Line;

    while(!File.eof() )
    {
        getline(File, Line);

        _tcout << Line << endl;
    }
    File.close();
    return 0;
}
4

3 に答える 3

1

あなたはファイルを読むことに関して古典的な基本的な間違いを持っ​​ています:

while(!File.eof() )
{
    getline(File, Line); // If this line fails (ie you reach EOF)
                         // Then you still print out the Line (whoes value is undefined)

    _tcout << Line << endl;
}

最後から2番目のgetlineはEOFまで(ただしEOFを含まない)読み取ることに注意してください。最後の呼び出しでは、EOFのみが読み取られます。この間違いは通常、上記のループが最後の行を2回印刷することを意味します(Lineの設定方法によって異なります)。

本当の解決策は、getlineをしばらくの間置くことです。

while(getline(File, Line))
{
    _tcout << Line << endl;
}

getline()がEOFを読み取る場合、Fileにフラグを設定します。getline()の結果は、ストリームオブジェクト(File)への参照です。これをブールコンテキストで使用すると、すべてがOKの場合はtrueに、何か問題が発生した場合はfalse(EOFなど)に変換可能な値に変換されます。 。これは、EOFに到達したときにループ本体が入力されないことを意味します。

もう1つ注意する必要があるのは、端末のプロパティとファイルの形式です。ミスマッチがあると、表示される文字が一致していないように見えます。

于 2010-06-20T20:59:02.760 に答える
1

を使用wifstreamすると、ファイルを UTF-16 として扱いますが、これは間違っています。torrent の仕様では、Unicode 文字ではなく、バイトの文字列で動作すると明確に述べています。BT は文字セット (コード ページ) も気にせず、クライアント プログラムの解釈に任せているような印象を受けます。ファイル名は単なるバイト文字列であり、何の意味もありません。

トレント ファイルにはバイナリ ハッシュ値が含まれているため、テキスト ファイルではないため、テキスト ファイルとして読み書きすることはお勧めできません。出力する前にハッシュ値を 16 進数に変換できるように、ベンコーディングパーサーを実装することをお勧めします。

于 2010-07-02T05:18:56.387 に答える
0

Neil Mayhewが彼の回答で述べたように、.torrentファイル全体をテキストとして扱うことは、バイナリデータが含まれているためあまり意味がありません。

次の点を再検討する必要があります。

  • ファイルサイズは。の倍数ではない可能性があるため、ワイド文字ストリームは使用しないでくださいsizeof(wchar_t)
  • read()getline().torrentファイルは行ベースのテキスト形式を使用しないため、この場合よりも望ましいです。
  • ファイルを開くときにフラグを使用してくださいios::binary。そうしないと、不要な行末変換が発生します(これはWindowsで発生します)
  • cout同じ理由で、バイナリモードに切り替える必要もあります。
于 2010-07-21T04:04:18.010 に答える