我想发送到我的打印机数据,我从文件加载,以便它可以打印条形码(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) { 输出&lt;&lt; '1D'; 输出&lt;&lt; '图6b'; 输出&lt;&lt; '05'; codeBarStarted = true; }
如果我用它替换它 if(* streamInputIterator == 0x14) { 输出&lt;&lt; 0x1d; 输出&lt;&lt; 0x6b; 输出&lt;&lt; 0×05; codeBarStarted = true; }
相应的输出仍然是错误的,但完全不同。当我使用0xXY时,打印的是十进制数,如:output&lt;&lt; 0x1d使打印机打印“29”(文本)。
答案 0 :(得分:1)
dar中的短片:以二进制模式打开两个文件,特别是std::ofstream
:
std::ofstream output("lpt1", std::ios::binary);
(无需另外指定std::ios::out
,因为无论如何都会在打开std::ofstream
时添加,但如果您愿意,可以使用std::ios::out | std::ios_binary
。
就个人而言,我会将IOStream用于输入和输出:
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";
}