0

我正在尝试读取给定文件中的字符并输出十六进制字符的数量。当我对一个文本文件运行它时,它或多或少是准确的,但几乎没有其他任何东西,它似乎已经偏离了。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 回答