MS-DOSプロンプトの画面をプリンタに出力されるプログラムを
作ろうと思いました。

#include <iostream.h>
main(){
char ppp;
cout << "pの入力でプリントします";
cin >> ppp;
if (ppp=='p'){
cout << "pが入力された";
ここでプリンタ出力命令
}
}

プリンタ出力命令はどういう命令文を書ければいいのか
教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

はっきり言って、ポインタの理解があやふやな今のA__さんには早いと思います。



bcc(もしかして、フリーbcc55コンパイラを使用なさっておられるのかな?)でやるということは、Win32APIを直接呼ぶプログラムを書く必要があります。

これは今のA__さんにはかなり難しいのではないでしょうか?
(書けたとしても、他人が書いたも同然で、
 まったく意味がわからないと思います。
 単に呼び出していると言うだけの世界です。)

今のA__さんの理解できる範囲内で、やるとすれば、
DOSプロンプトの仕組の一つである、
リダイレクト機能を利用するのが簡単かもしれません。


#include <iostream.h>
#include <stdlib.h>
#include <string>

void main(int, char *argv[]) {
/* 引数があるかないかによって、「モード」を分ける
* 仕組の説明:
* p が入力  → 〔自分〕〔ppp〕〔> PRN〕の形式で自分自身を呼び出す
* p が非入力 → そのまま終了
*/

// 引数がないと、要求モードに入る
if (!argv[1]) {
cout << "[p] の入力でプリントします。\n$>";

char ppp;
cin >> ppp;

if (ppp=='p') {
cout << "p が入力されました。\n";

// p が押されると、〔自分〕〔ppp〕〔> PRN〕の形式で自分自身を呼び出す
string s=string(argv[0])+" "+ppp+" > PRN\0";
system(s.c_str());
}

} else {
// 〔自分〕〔ppp〕〔> PRN〕の形式で自分自身を呼び出されるとここにくる。
// ここでのこのプログラムの役割は、印刷すべき文字を吐き出すだけ。
cout << argv[1];
}
}

ここでは、強引にひとつのプログラム(はっきり言って、こんなプログラムは構造的に推奨されません)としましたが、

(1)「入力の要求用 兼 入力されたデータをファイルに残しておくプログラム」
(2)「データファイルを読みこみ、表示するプログラム」

という2つのプログラムを作成し、(1)で p が入力されたときに
system("(2)の名前.exe >PRN")としてやるのが より良いプログラム設計といえると思います。
    • good
    • 0
この回答へのお礼

C++の初級の勉強のは、まずは文字列の処理とプリントアウトぐらいを
覚えよう と思っていたけど、プリンター出力命令は思ったより
難しいものだと知りました。
でも、プリンター出力は知っておきたいからなんとか理解しようと
がんばります。
初心者のための簡単なソースを教えてもらえたのがうれしかったです。
コンパイラはbcc5.5です。
ありがとうございます。

お礼日時:2001/03/21 00:37

DOSならSTDPRNに対応するストリームを開けばできますね。


"prn:"をストリームで開いて書きこめばプリンタに出力されます。

「DOS画面を」ということに固執するとVxDを書かないといけません。
“画面”の出力はドライバの範疇です。
    • good
    • 0
この回答へのお礼

言葉が難しくて分からなかったけど、プリンタ出力をする時の
キーワードになると思いました。
ありがとうございます。

お礼日時:2001/03/21 00:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Qtry{}catch(){}とデストラクタの関係を教えてください。

try-catchでメモリ確保を含むクラスをスローした場合、デストラクタはどの時点で働くのか、教えてください。たとえば、↓の使いかたは大丈夫でしょうか?

【1】
try{
 throw(CError(100, "エラー情報"));
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
}

【2】
try{
 CError err(100, "エラー情報");
 throw(err); // (1)
}catch(CError& err){
 //ここでerrを参照しても問題ないのでしょうか?
 //まだデストラクタはちゃんと動作するのでしょうか?
 //catchが呼び出し元のメンバであったりしても大丈夫なのでしょうか?
}

宜しくお願いします。

Aベストアンサー

【1】【2】どちらの場合も問題がありません。
コンパイラが必要に応じてerrオブジェクトのコピーを作成します。
デストラクタが呼び出されるタイミングはコンパイラに依存するところもあると思いますが、
例えばVC7.1では【2】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) CErrorクラスのテンポラリオブジェクト(以下a)のコピーコンストラクタが呼び出される。
(3) errオブジェクトのデストラクタが呼び出される
(4) catch文まで到達
(5) aオブジェクトのデストラクタが呼び出される。

VC7.1では、【1】は以下のように動作します。
(1) errオブジェクトのコンストラクタが呼び出される
(2) catch文まで到達
(3) errオブジェクトのデストラクタが呼び出される。

コンパイラがオブジェクトのコピーを省略しているようです。

Q{x = x>y ? x:y; return x;}

#include <iostream>
using namespace std;

inline int max(int x, int y){x = x>y ? x:y; return x;}

int main()
{
int num1, num2, ans;

cout << "2つの整数を入力して。\n";
cin >> num1 >> num2;

ans = max(num1, num2);

cout << "最大値は" << ans << "です。\n";

return 0;
}
の{x = x>y ? x:y; return x;}の部分の意味が解りません。

Aベストアンサー

inline int max(int x, int y){x = x>y ? x:y; return x;}
これを普通に関数で書くと

int max(int x, int y)
{
x = x>y ? x:y;
return x;
}

です。

x = 部分は右辺の結果が代入されます。これはわかりますよね。
x>y?x:y;
と書くと?より左にある条件式を判定し、その結果が真である場合は:で区切られた左側の値を、偽である場合は右の値を帰します。
x>yが真であればxを、偽であればyを返します。
それが、左辺値xに代入され、関数の戻り値として帰ります。

従って、2つの値をこの関数に入れると、大きいほうの値が帰ることになります。

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう

Qchar AA[]{"全角文字"};から"全"という一字を取り出したい

 今晩は、Cの初心者です、宜しくお願いします。
 全角文字の入ったchar AA[]{"全角文字"};から"全"という文字一字を取り出す時にAA[0]とかくとエラーになります。
 どのようにしたら取り出せるのでしょう。
 ポインタを使う方法と使わない方法を教えて下さい。
 宜しくお願いします。

Aベストアンサー

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出す必要があります。

>char AA[]={'全','角'};

char AA[]="全角";
とし
>printf("%s%s\n" , AA[0],AA[1] ) ;

printf("%c%c\n" , AA[0],AA[1] ) ;
とすれば、「全」だけを表示する事が可能と思われます。

日本語を文字列で表示する為の文字コードについては
Shift-JISだけでなく、UnicodeやUTF・EUC・JISなどがあります。

もう少し詳しく記載してあるホームページはないか探してみましたが、ちょっと無理でした。

参考URL:http://marupeke296.com/CPP_charUnicodeWideChar.html

お疲れ様です。

まずお伺いしたのがOSおよび開発するためのコンパイラです。

ロケール等の話は分かりませんが、昔のC言語で日本語を扱う場合には全角文字1文字で2個つのchar領域を使用していました。
(マルチバイト文字セットと言います。)

詳細は参考URLを参照の事。

windowsでVCと仮定した場合、charを使われていると言うことは、多分、shift-jis(シフトJIS)で文字列を扱っていると思われます。

結論として全角文字1文字だけを取り出したいという場合は、結局char2個分のデータを取り出...続きを読む


人気Q&Aランキング

おすすめ情報