用C++实现hexdump命令的功能:将文件内容用16进制数打印输出
- C/C++
- 2015-07-16
- 250热度
- 0评论
引言
要实现如下图这样的功能:
这是一个小练习,由于很久没有写过C++程序了,虽然知道大概应该怎么做,但是C++的很多语法细节部分都不很熟悉。尤其是涉及到文件流操作时,大量查阅网络资料,感到有些棘手。写了应该有5个小时以上吧。在最后一个BUG上耗费了大量时间,根源是对于ifstream类的一些方法理解不深,后来在地铁上查阅了一下C++的文档,想通之后,很快解决了问题。
正文
程序源码如下:
/*************************************************************************
> File Name: myhex.cpp
> Author: plough
> Date: 2015年07月17日
> Description: 模拟hexdump命令,打印文件的内容。
************************************************************************/
#include <iostream>
#include "stdio.h"
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
char* filename = argv[1];
ifstream fin;
fin.open(filename, ios::binary);
if (!fin)
{
cerr << "打开文件出错!" << endl;
return 1;
}
unsigned char ch[2] = {0};
int count = 0; // 统计打开文件中的字节数
while (!fin.eof())
{
ch[0] = fin.get();
if (fin.eof())
break;
if (count == 0) // 第一次进入循环时,打印count值
printf("%07x", count);
count++;
ch[1] = fin.get();
if (!fin.eof())
count++; // 读取成功,计数加1
else
ch[1] = 0; // 读取失败,置零
printf(" %02x%02x", ch[1], ch[0]);
if (count % 16 == 0) // 每打印16个字节,换行
{
cout << endl;
printf("%07x", count);
}
} // end of while(!fin.eof())
// 文件不为空,并且上次循环结束时没有打印换行符和count值。
if (count % 16 != 0)
{
cout << endl;
printf("%07x", count);
}
if (count != 0) // 文件不为空
cout << endl;
fin.close();
return 0;
}