用C++实现hexdump命令的功能:将文件内容用16进制数打印输出

引言

要实现如下图这样的功能:

这是一个小练习,由于很久没有写过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;
}