我正在尝试读取给定文件中的字符并输出十六进制字符的数量。当我针对文本文件运行它时,它或多或少准确但几乎任何其他东西似乎都是关闭的。 IE:一个* .mp4文件,大约700MB将出现在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 ;
}
答案 0 :(得分:2)
您需要以binary
模式打开文件。
ifstream file( stringinput.c_str() ) ;
应该是:
ifstream file( stringinput.c_str(), ios_base::in | ios_base::binary ) ;
以文本模式读取文件意味着某些字符(例如CTRL-Z)被视为“文件结束”,因此如果恰好是您输入的一部分,您的阅读将过早结束。由于mp4文件是具有非常“随机”内容的二进制文件,因此无法保证这些字符不会出现在文件中。
答案 1 :(得分:2)
需要以 二进制模式 打开.mp4
文件:
std::ifstream file(stringinput.c_str(), std::ios_base::in | std::ios::binary) ;
如果未指定std::ios::binary
标志,则默认情况下文件以文本模式打开。这样做的问题是文件的内容被解释为它是文本(即运行时假定所有字节都在有效范围内并且具有由系统区域设置的字符集定义的某种含义,例如ASCII或UTF-8)。因此,它会执行诸如将新行字符从DOS转换为UNIX格式(或反之亦然),或以特殊方式处理某些控制字符等操作。
有关详细信息,请参阅Difference between files writen in binary and text mode。