【问题标题】:How to catch errors when printing raw text in C在 C 中打印原始文本时如何捕获错误
【发布时间】:2012-03-14 02:35:05
【问题描述】:

我知道如何简单地将文本文件打印到打印机: (见代码块下方我的问题)

#include <stdio.h>
#include <stdlib.h>

int main ( void )
{
     FILE * Printer = fopen("LPT1", "w");
     FILE * FilePointer;
     char str[256];
     char buf[BUFSIZ];
     FilePointer = fopen("sample.txt", "r");
     if( !FilePointer )
     {
        printf("File does not exist\n");
        return -1;
     }
     while( fgets ( buf, sizeof buf, FilePointer ) != NULL ) 
     {
            fprintf(Printer, "%s", buf);
     }
         printf("\nPrinting..\n");
     fprintf(Printer, "\f");

     getch(); 
     return 0;
}

但我的问题是在使用这种技术将文本打印到打印机时捕获错误。 如果用户当时没有有效或可用的打印机怎么办?我希望我的程序吐出类似的内容:“错误:打印机不存在!”。

有什么我可以做的吗?谢谢!

【问题讨论】:

  • 打印机不是一个简单的文本文件。你不能那样工作。先用谷歌试试?
  • 我删除了 C++ 标签,因为这是 C 代码。
  • 我不确定,但是您是否尝试过控制 fprintf 的返回值?如果无法写入,它会返回一个负值,所以我想这就是没有打印机时会发生的情况。 cplusplus.com/reference/clibrary/cstdio/fprintf

标签: c windows printing


【解决方案1】:

您可以检查打印机是否在线,但如果您可以访问内核模式、您是打印驱动程序或在 Windows 95/98 下。

通常,打印机端口地址设置为0x378(并口数据寄存器)。加一 (0x379) 给我们并行端口状态寄存器的地址。状态寄存器 (SELECT) 的第 4 位告诉我们打印机是在线还是离线。如果设置了该位,则打印机在线 如果为 0,则该位处于脱机状态。 它可能看起来像这样:

int status;

// get status register value at 0x379
status = _inp (0x379);

if (status & 0x10) // check bit 4
{
// printer online
}
else
{
// printer offline
} 

这是该寄存器的其他成员:

 bit 1 : DCN
 bit 3 : FAULT
 bit 4 : SELECT
 bit 5 : PAPER END
 bit 6 : ACKNOWLEDGE
 bit 7 : BUSY

它来自codeguru。但请注意,您最好使用更高的接口,例如 WIN32 中的打印机 api(OpenPrinter()、WritePrinter()、StarDocPrinter()、StartPagePrinter() 等)

【讨论】:

  • 我不相信你可以访问数据端口,除非你处于内核模式(即用户级执行代码不能这样做)
  • @Jason 我同意你的看法,请看我回答的第一行
  • 我想当我想到“特权用户”时,我会想到超级用户或 root 类型的访问权限,这与内核模式(即驱动程序)不同。换句话说,您可以在操作系统级别以管理员或 root 权限运行可执行文件,但这不会将处理器中的当前特权级别从用户模式更改为内核模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多