0

ディスクからファイルを読み取り、その 16 進数表現を出力しようとしています。

私が使用したコードは次のとおりです。

#include <iostream>
#include <fstream>
using namespace std;
 
int main() {
        ifstream file ("mestxt", ios::binary);
        if (file.is_open())
        {
                char* buffer;
                buffer= new char[0];
                cout<< "File open"<<endl;
                int count=0;
                while (file.good())
                {
                        file.read(buffer, 1);
                        cout<<hex<<int(*buffer)<<" ";
                        count++;
                        if (count%16==0) cout<<endl;
                }
                file.close();
        }
}

それは機能しますが、ただ... 私を怖がらせます。

入力:

bn0y5328w9gprjvn87350pryjgfpxl

出力:

ファイルを開く

62 6e 30 79 35 33 32 38 77 39 67 70 72 6a 76 6e

38 37 33 35 30 70 72 79 6a 67 66 70 78 6c 6c

4

3 に答える 3

6

これを行う簡単な方法があります。ループの設定はSTLに任せてください。16進コードの出力のみに関心がある場合は、次の最も単純なバージョンを使用します。

#include <iterator>
#include <algorithm>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    ifstream is("content", ios::binary);
    cout << hex;
    copy(
       istream_iterator<char>(is), 
       istream_iterator<char>(), 
       ostream_iterator<int>(cout, " ")
       );
}

文字数もカウントして書式設定を行う場合は、次のように変更する必要があります。

#include <iterator>
#include <algorithm>
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    int cnt = 0; // Will hold the number of characters
    ifstream is("content", ios::binary);
    cout << hex;
    transform(
        istream_iterator<char>(is),
        istream_iterator<char>(),
        ostream_iterator<int>(cout, " "), [&cnt] (char c) -> int {
            if (cnt % 16 == 0) cout << endl;
            cnt++; 
            return c; 
            }
        );
}

上記はラムダ関数を使用しているため、C++11が必要です。ただし、C++98のカスタム定義のファンクターを使用して同じことを簡単に実現できます。

于 2013-01-29T15:09:32.013 に答える
2

char[0]簡単に修正できる未定義の動作 ( の代わりに を割り当て、割り当てられたスペースの 1 バイトchar[1]後に - に書き込む)を除けば、プログラムは問題ありません。buffer[0]単一要素の配列の代わりにスカラーを使用できます。

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    ifstream file ("mestxt", ios::binary);
    if (file.is_open())
    {
        char buffer;
        cout<< "File open"<<endl;
        int count=0;
        while (file.good())
        {
            file.read(&buffer, 1);
            cout<<hex<<int(buffer)<<" ";
            if ((++count)%16==0) cout<<endl;
        }
        file.close();
    }
}

一度に複数の文字を読み取ることで、プログラムをより効率的にすることができますが、小さなサイズの入力ではまったく問題になりません。

于 2013-01-29T14:56:41.140 に答える
0

ファイルがメモリに収まるほど小さいことがわかっている場合は、ファイル全体をバッファに読み取ってから解析する方がはるかに高速です。

std::ifstream file("mestxt", std::ios_base::binary);
file.seekg(0, std::ios_base::end);
std::vector<char> buffer(file.tellg()); 
file.seekg(0, std::ios_base::beg);
file.read(&buffer.front(), buffer.size());

std::cout << std::hex;
std::copy(buffer.cbegin(), buffer.cend(), std::ostream_iterator<int>(std::cout, " "));
于 2013-01-29T15:17:26.080 に答える