2012-03-20 165 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