c++ - 以编程方式将原始数据发送到打印机

标签 c++ windows visual-c++

我想将从文件加载的数据发送到我的打印机,以便它可以打印条形码 (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;

我唯一的猜测(也是一个盲目的猜测)是我错误地假设 ofstream 正在接收原始数据,而实际上并没有……我不知道为什么或如何解决这个问题。

我不是在要求“为我做功课”的答案(尽管一个非常清晰和史诗般的答案会很棒)但至少如果你能以正确的方式指出我为什么没有得到预期的结果,我将不胜感激。甚至我自己搜索和研究的一些关键字也很棒。老实说,我不知道我做错了什么。

这是我尝试使用 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++;
    }

请注意,当我这样做时 如果(*streamInputIterator == 0x14) { 输出 << '1d'; 输出 << '6b'; 输出 << '05'; codeBarStarted = true;

如果我用 如果(*streamInputIterator == 0x14) { 输出 << 0x1d; 输出 << 0x6b; 输出 << 0x05; codeBarStarted = true;

相应的输出仍然是错误的,但完全不同。当我使用 0xXY 时,打印的是十进制数,如:output << 0x1d makes the printer print "29"(text).

最佳答案

dar 中的一个简短说明:以二进制模式打开两个文件,特别是 std::ofstream:

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

(不需要也指定 std::ios::out 因为它是在打开 std::ofstream 时添加的,但是你可以使用 std::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";
}

关于c++ - 以编程方式将原始数据发送到打印机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005940/

相关文章:

c++ - 使用自定义分配器使 std::list 缓存友好?

c++ - opencv重写一个压缩视频文件

c++ - 外部指向 0x00000000

c - 如何在C程序中获取当前文件夹的父目录?

visual-c++ - 如何在没有 Windows 安装程序的情况下安装 vc++ 可再发行组件

visual-c++ - 编译 x64 代码时, "x86_amd64"和 "amd64"有什么区别?

c++ - 在 C++ 的析构函数中允许做什么?

c++ - _WIN64 未在 x64 项目中定义

c# - 该系统找不到指定的路径

php - 如何找出特定进程仍在PHP中运行