0

特定のファイル内の文字を読み取り、16 進数の文字数を出力しようとしています。これをテキストファイルに対して実行すると、多かれ少なかれ正確ですが、他のほとんどのものではかなりずれているようです。IE: ~700MB の *.mp4 ファイルは 12K で表示されます。ここで何が欠けていますか?

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

int main()
    {
    char letter ;
    int i ;
    cout << "Input the filename:" << endl;
    string stringinput;
        cin >> stringinput;
    ifstream file( stringinput.c_str() ) ;
    if( ! file )
    {
        cout << "Error opening input file, " << ( stringinput ) << ". Check file path and try again." << endl ;
        return -1 ;
    }
    else
        for( i = 0; ! file.eof() ; i++ )
        {
            file.get( letter ) ;
            //cout << hex << (int) letter;
        }
        cout << endl;
        float k = 1024, m = 1048576;
        file.close();
        if( i < 1024)
        {
            cout << "Total: " << dec << i << endl;
        }
        else if( i < m)
        {
            cout << "Total: " << dec << (i / k) << "K" << endl;
        }
        else
        {
            cout << "Total: " << dec << (i / m) << "M" << endl;
        }
        return 0 ;
}
4

2 に答える 2

2

モードでファイルを開く必要がありbinaryます。

ifstream file( stringinput.c_str() ) ;

次のようにする必要があります。

ifstream file( stringinput.c_str(), ios_base::in | ios_base::binary ) ;

テキストモードでファイルを読み取ると、特定の文字 (CTRL-Z など) が「ファイルの終わり」として扱われることを意味するため、入力の一部である場合、読み取りが途中で終了します。mp4 ファイルはかなり「ランダムな」コンテンツを含むバイナリ ファイルであるため、これらの文字がファイルに含まれていないことを保証することはできません。

于 2013-03-31T01:13:32.143 に答える
2

ファイルはバイナリ モード.mp4で開く必要があります。

std::ifstream file(stringinput.c_str(), std::ios_base::in | std::ios::binary) ;

std::ios::binaryフラグを指定しない場合、ファイルは既定でテキスト モードで開かれます。これを行う際の問題は、ファイルの内容がテキストであるかのように解釈されることです (つまり、ランタイムは、すべてのバイトが有効な範囲内にあり、ASCII や UTF などのシステム ロケールの文字セットによって定義された特定の意味を持つと想定します)。 -8)。したがって、改行文字を DOS 形式から UNIX 形式に (またはその逆に) 変換したり、特定の制御文字を特別な方法で処理したりします。

詳細については、バイナリ モードとテキスト モードで書き込まれたファイルの違いを参照してください。

于 2013-03-31T01:13:46.383 に答える