第62章 無理矢理印刷する


DOSの時代はCでテキストを印刷するプログラムはそれほど難しくありませんでした。

現在はどうでしょうか。はっきり言って面倒です。では、表題の通り無理矢理印刷する プログラムを考えてみます。環境によっては全然動作しないことも考えられますので うまく動かないからといって、考え込まずにさっさとこの章をとばしてください。



DOSの時代には

fprintf(stdprn, "abc\f\r");

を実行するとabcと印刷されて、プリンタからこの用紙が排出されました。 Windows時代になってからはstdprnは使えなくなりました。また、 DOSの時代にはプロンプトから

TYPE TEST.TXT > PRN

と入力するとTEST.TXTの内容が印刷されました。 これは、WindowsのDOS窓から実行できるでしょうか。

試してみてください。多分「デバイスの準備ができていない」などと 怒られて、実行できないでしょう。

ネットワークコンピュータを使っている場合はPRNの代わりに

\\コンピュータ名\プリンタ名

を使うと印刷されることがあります。筆者の環境ではWindows2000の DOS窓では、印刷されましたが、Windows98からはだめでした。 また、印刷が可能であっても漢字は文字化けします。

以上をふまえて無理矢理印刷するプログラムを考えてみます。 考えられる方法は

1.system関数で"TYPE TEST.TXT > コンピュータ名を含むプリンタ名"を実行してみる 2.stdprnが使えないのなら   FILE *fp; fp = fopen(コンピュータ名,"w"); fprintf(fp, ".....");

今回は2.の方法でプログラムを作ってみます。

// prn01.c #include <stdio.h> #include <process.h> #include <conio.h> int main() { char szPrnName[64]; char szFName[64]; char szBuf[1024]; FILE *fprn, *fp; printf("プリンタの名前を入力してください-->"); scanf("%s", szPrnName); printf("印刷したいテキストファイルを指定してください。-->"); scanf("%s", szFName); fprn = fopen(szPrnName, "w"); if (fprn == NULL) { printf("プリンタのオープンに失敗しました\n"); exit(-1); } fp = fopen(szFName, "r"); if (fp == NULL) { printf("ファイルのオープンに失敗しました\n"); fclose(fprn); exit(-2); } while (fscanf(fp, "%s", szBuf) != EOF) { fprintf(stdout, "%s\r\n", szBuf); fprintf(fprn, "%s\r\n", szBuf); } fprintf(fprn, "\f\r"); fclose(fprn); fclose(fp); return 0; }

このプログラムがうまくいっても、少し結果がおかしいですね。 テキストにスペースがあるとそこで切れて、次の行に行かされます。 (そのようにプログラムを書いているのですが・・)

このプログラムが全然動かない人は、これ以上進まないでください。 時間の無駄です。

動作した人は、もう少し改良したものを作ってみましょう。

// prn02.c #include <stdio.h> #include <process.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <io.h> #include <malloc.h> int main() { char szPrnName[64]; char szFName[64]; char *lpszBuf; FILE *fprn, *fp; int fh; long filelength; printf("プリンタの名前を入力してください-->"); scanf("%s", szPrnName); printf("印刷したいテキストファイルを指定してください。-->"); scanf("%s", szFName); fprn = fopen(szPrnName, "w"); if (fprn == NULL) { printf("プリンタのオープンに失敗しました\n"); exit(-1); } fh = open(szFName, _O_RDONLY); if (fh == -1) { printf("ファイルが見つかりません\n"); exit(-2); } filelength = _filelength(fh); close(fh); lpszBuf = (char *)malloc(filelength); if (lpszBuf == NULL) { printf("メモリの確保に失敗しました\n"); fclose(fprn); exit(-4); } memset(lpszBuf, '\0', filelength); fp = fopen(szFName, "r"); if (fp == NULL) { printf("ファイルのオープンに失敗しました\n"); fclose(fprn); exit(-3); } fread(lpszBuf, sizeof(char), (size_t)filelength, fp); fprintf(stdout, "%s", lpszBuf); fprintf(fprn, "%s", lpszBuf); fprintf(fprn, "\f\r"); fclose(fprn); fclose(fp); free(lpszBuf); return 0; }

さて、見慣れないヘッダファイルがたくさん出てきましたが、これは open 関数を使うためです。open関数でコンパイル時にエラーの出る人は_open(); とアンダスコアを付けてみてください。(第50章参照)

_filelength関数でファイルサイズを知ることができますが、これには open関数の戻り値が必要となります。

サイズがわかったら動的にメモリを確保します。 そして、fread関数で一気にファイルの中身を読み出して画面とプリンタに書き込みます。

fread関数は次のようになっています。

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

bufferには読み込んだ内容を格納するバッファのポインタを指定します。 sizeには項目サイズ、countには読み出す最大項目数、streamには FILE 構造体へのポインタを指定します。

プリンタに"\f\r"を出力するとプリンタは次のページまでから送りされて 用紙が排出されます。(すべてのプリンタでこうなるとは限らない)

さて、このプログラムは、あなたの環境で動いたでしょうか。 ま、プログラムの練習だと思ってやってみてください。


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/31/2001 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。