【发布时间】:2014-05-23 00:09:03
【问题描述】:
好的,所以我调用 read file 来填充 slop 槽,但它仅适用于 .txt 或 .bin 文件,当我打开其他任何文件时崩溃,例如 .doc 文件 错误代码0xC0000005:访问冲突执行位置0xFFFFFFFF。
这也是显示文件的十六进制和 ascii 转储的正确方法吗?
//The slop_trough I dump all the hex and ascii slop into
unsigned char slop_trough [MAX] = {0} ;
void ReadFile (string filename, unsigned char slop_trough [])
{
ifstream open_bin;
open_bin.open( filename, ios::in | ios::binary ) ;
if ( open_bin.is_open() )
{
open_bin.read ( reinterpret_cast <char *> (slop_trough),
sizeof(slop_trough) * MAX ) ;
open_bin.close();
}
else
cout << "File not opened!" << endl;
}
void HexDump (unsigned char slop_trough [])
{
for ( int j = 0; j < MAX - 1; ++j)
{
cout << hex << slop_trough[j] ;
}
}
void AsciiDump(unsigned char slop_trough [])
{
for ( int p = 0; p < MAX - 1; ++p)
{
cout << slop_trough[p];
}
}
【问题讨论】:
-
sizeof(slop_trough) * MAX这将读取sizeof(unsigned char*) * MAX字符,通常是缓冲区实际大小的 4 到 8 倍。 -
如果文件短于
MAX字节怎么办?为什么要将数组的大小乘以MAX? -
@user657267
slop_trough是一个数组,而不是一个指针。所以它实际上会读取MAX * MAX字节。数组在sizeof中使用时不会衰减为指针。 -
函数中的@Barmar
slop_trough是一个指向unsigned char的指针,不要让[]语法欺骗了你。 -
哎呀,你是对的,没有注意到它是一个函数参数以及一个全局变量。使用相同的变量名是另一种不好的做法。
标签: c++ hex ascii dump utility