2012-03-20 166 views
1

我希望从C++代码(我用xcode 4编码)直接打印一些文本到网络打印机。我知道unix上的所有内容都是一个文件,并且认为使用C++中的fstream方法将文本重定向到打印机设备文件是不可能的。唯一的问题是我不知道与我的网络打印机相关的/ dev中的设备文件。在mac上使用fstream C++打印到网络打印机

  1. 是否可以使用fstream方法实现打印?喜欢的东西

    std::fstream printFile; 
    printFile.open("//PATH/TO/PRINTER/DEV", std::ios::out); 
    
    printFile << "This must go to printer" << std::endl; 
    printFile.close(); 
    

    而且,如果是的话

  2. 如何获取对应于特定的打印机/ dev目录中的文件吗?

由于提前, 尼基尔

+0

看起来像第一部分,你可以试试看,找出答案。 *手动*确定设备名称并将其硬编码到您的测试程序中,以查看您是否可以完全按照这种方式进行打印。如果成功,*然后*询问如何以编程方式确定设备名称。 – 2012-03-20 22:13:43

回答

0

开幕式和直接写入过去可能早在串行打印机的日子文件;但是,这不是今天可用的方法。

CUPS守护进程在OS X和许多其他Unix系统上提供了打印队列,调度和管理接口。您可以使用lp(1)lpr(1)命令来打印文件。 (不同命令来自多年来在Unix系统中可用的不同版本的打印假脱机程序;一个源自BSD源,另一个源自AT源,为了兼容性,CUPS提供这两个程序。)

你可能也可以用popen(3)之类的方式实现。在外壳,它会是这样的:

echo hello | lp - 

-说,从标准输入打印。

我没有测试过这一点,但popen(3)相当于大概是这样的:

FILE *f = popen("lp -", "w"); 
if (!f) 
    exit(1); 
fprintf(f, "output to the printer"); 

我建议在shell测试一些投入首先要确保CUPS准备处理的格式您打算发送的内容。您可能需要使用CRLF而不是仅用\n来终止行,否则打印机可能会“阶梯式”输出。或者,如果您要发送PDF或PS或PCL数据,则应该尽可能以最便宜的方式进行测试,以确保打印系统按预期工作。

+0

@Samold:非常感谢您的回复。我已经尝试过使用popen()。这也是有效的。我所关心的是(1)popen是一个系统调用,它可以减慢我的代码,(2)最好是知道处理类似C++的方式,因为我也必须从其他设备读取,在不久的将来。 再次感谢:) – 2012-03-20 22:24:59

+0

请注意,打开文件_also_使用系统调用。 “popen(3)”可能较慢的地方是它也开始'sh -c'来执行'lp'或'lpr'程序。在我的Linux系统上,我能够每秒启动1000多个'sh -c'。“lp”或“lpr”的时机会比较困难一些,因为那里的状态更多,但我希望您能够提交比您的打印机能够处理作业快几千倍的打印作业。 [维基百科声称每分钟200页](http://en.wikipedia.org/wiki/Laser_printer)为好的激光打印机;打印机的速度有多快? :) – sarnold 2012-03-20 22:33:52