現在はどうでしょうか。はっきり言って面倒です。では、表題の通り無理矢理印刷する プログラムを考えてみます。環境によっては全然動作しないことも考えられますので うまく動かないからといって、考え込まずにさっさとこの章をとばしてください。
DOSの時代には
fprintf(stdprn, "abc\f\r");
を実行するとabcと印刷されて、プリンタからこの用紙が排出されました。 Windows時代になってからはstdprnは使えなくなりました。また、 DOSの時代にはプロンプトから
TYPE TEST.TXT > PRN
と入力するとTEST.TXTの内容が印刷されました。 これは、WindowsのDOS窓から実行できるでしょうか。
試してみてください。多分「デバイスの準備ができていない」などと 怒られて、実行できないでしょう。
ネットワークコンピュータを使っている場合はPRNの代わりに
\\コンピュータ名\プリンタ名
を使うと印刷されることがあります。筆者の環境ではWindows2000の DOS窓では、印刷されましたが、Windows98からはだめでした。 また、印刷が可能であっても漢字は文字化けします。
以上をふまえて無理矢理印刷するプログラムを考えてみます。 考えられる方法は
今回は2.の方法でプログラムを作ってみます。1.system関数で"TYPE TEST.TXT > コンピュータ名を含むプリンタ名"を実行してみる 2.stdprnが使えないのなら FILE *fp; fp = fopen(コンピュータ名,"w"); fprintf(fp, ".....");
このプログラムがうまくいっても、少し結果がおかしいですね。 テキストにスペースがあるとそこで切れて、次の行に行かされます。 (そのようにプログラムを書いているのですが・・)// 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; }
このプログラムが全然動かない人は、これ以上進まないでください。 時間の無駄です。
動作した人は、もう少し改良したものを作ってみましょう。
さて、見慣れないヘッダファイルがたくさん出てきましたが、これは open 関数を使うためです。open関数でコンパイル時にエラーの出る人は_open(); とアンダスコアを付けてみてください。(第50章参照)// 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; }
_filelength関数でファイルサイズを知ることができますが、これには open関数の戻り値が必要となります。
サイズがわかったら動的にメモリを確保します。 そして、fread関数で一気にファイルの中身を読み出して画面とプリンタに書き込みます。
fread関数は次のようになっています。
bufferには読み込んだ内容を格納するバッファのポインタを指定します。 sizeには項目サイズ、countには読み出す最大項目数、streamには FILE 構造体へのポインタを指定します。size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
プリンタに"\f\r"を出力するとプリンタは次のページまでから送りされて 用紙が排出されます。(すべてのプリンタでこうなるとは限らない)
さて、このプログラムは、あなたの環境で動いたでしょうか。 ま、プログラムの練習だと思ってやってみてください。
Update Mar/31/2001 By Y.Kumei