0

バーコード (ITF 2/5) を印刷できるように、ファイルから読み込んだデータをプリンターに送信したいと考えています。

コマンド プロンプトを使用して「print c:\test lpt1」を実行すると、おまじないのように機能し、予想されるバーコードが出力されます。ただし、これをプログラムで実行しようとすると、プリンターは上記のバーコードを提供できません。読みやすいテキストは問題なく動作します。これは (これまでのところ) バーコード印刷に関する問題だけです。

私は次のコードを持っています (私は思った) プリンターの生データ (決してレンダリングされていない) を送信して、プリンターに送信しているバイトをデコードする方法をプリンターが決定できるようにします。

std::FILE* fd = fopen("c:\\test", "rb");
std::fseek(fd, 0L, SEEK_END);
int size = std::ftell(fd);
std::fseek(fd, 0L, SEEK_SET);
int beginning = std::ftell(fd);
if(fd == NULL)
{
    std::cerr << "Error opening file\n";
    return;
}
char* buffer = (char*)malloc(size);
std::fread(buffer, 1, size, fd);
std::ofstream output("lpt1", std::ios_base::out);
output << buffer;

私の唯一の推測(そして盲目的な推測)は、オブストリームがそうでないときに生データを受信して​​いると誤って想定していることです...そして、それを解決する理由や方法がわかりません。

「私のために宿題をしてください」という答えを求めているわけではありませんが(非常に明確で壮大な答えは素晴らしいでしょう)、少なくとも、期待した結果が得られない理由を正しい方法で指摘していただければ、本当に感謝します。自分で検索・研究するためのキーワードでも結構です。正直なところ、自分が何を間違っているのかわかりません。

これは、IOStreams を使用するよう提案されたために試した新しいコードです。input.rdbuf() の内容を編集しようとすると、望ましい結果が得られません。

static void ImprimirArchivo(unsigned char* path)
{
    std::ifstream input((char*)path, std::ios::binary);
    std::ofstream output("lpt1", std::ios::binary);

    std::istreambuf_iterator<char> eos;
    std::istreambuf_iterator<char> streamInputIterator (input.rdbuf());

    bool codeBarStarted = false;
    int iterationsCounter = 0;
    while(streamInputIterator!=eos)
    {
        if(*streamInputIterator == 0x14)
        {
            output << '1d';
            output << '6b';
            output << '05';
            output << '30';
            codeBarStarted = true;
        }
        else
        {
            output << *streamInputIterator;
        }

        if(codeBarStarted)
        {
            iterationsCounter++;
            if(iterationsCounter == 10)
            {
                output << 0x00;
                codeBarStarted = false;
                iterationsCounter = 0;
            }
        }

        streamInputIterator++;
    }

if(*streamInputIterator == 0x14) { output << '1d'; を行うときは注意してください。出力 << '6b'; 出力 << '05'; codeBarStarted = true; }

それを if(*streamInputIterator == 0x14) { output << 0x1d; に置き換えると、出力 << 0x6b; 出力 << 0x05; codeBarStarted = true; }

対応する出力はまだ間違っていますが、まったく異なります。0xXY を使用すると、次のように 10 進数が出力されます。 output << 0x1d は、プリンターに "29" (テキスト) を出力させます。

4

1 に答える 1

1

dar の短い: 両方のファイルをバイナリ モードで開きます。特にstd::ofstream:

std::ofstream output("lpt1", std::ios::binary);

(とにかくstd::ios::outaを開くと追加されるので指定する必要はありませんが、必要に応じて使用できます)。std::ofstreamstd::ios::out | std::ios_binary

個人的には、入力と出力の両方に IOStreams を使用します。

std::ifstream input("c:\\test", std::ios::binary);
if (input) {
    std::ofstream("lpt1", std::ios::binary) << input.rdbuf();
}
else {
    std::cerr << "ERROR: failed to open 'c:\\test' for reading\n";
}
于 2012-12-22T19:58:49.363 に答える