- ベストアンサー
C++のstream(ストリーム)について
簡単に聞きます。すごく困ってます。 func(istream** out, char *in); C++(VC)で上のようなchar*のバッファをistreamで出力するような関数を作成したいです。 が、その方法が良く分かりません。 istreamはすでに格納された物から読み込むことにしか したことがありません。 調べてもさっぱりです・・・。 どなたか詳しい方がいらっしゃいましたら是非ご教授下さい!
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (8)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
- MrBan
- ベストアンサー率53% (331/615)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
- amru05
- ベストアンサー率63% (33/52)
- rinkun
- ベストアンサー率44% (706/1571)
- Tacosan
- ベストアンサー率23% (3656/15482)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
- Werner
- ベストアンサー率53% (395/735)
関連するQ&A
- 【C++】ストリームオブジェクトを切り替える方法に
ただ今C++を勉強中です. 関数を作成する際,引数を以下の様にして出力先を切り替えるようにしています. void Function(ostream &out) { out << "文章"; } 引数を変えることで,標準出力やファイル出力を選択出来て重宝しています. でも,最近はある条件の時はどこにも出力させないという処理は出来ないかと考えております. 例えば, 条件がAの時はcout, 条件がBの時はfout, 条件がCの時は出力させない と言ったようにです. 何か良い方法はあるでしょうか? 引数にostreamを入れた様々な関数を多用しているため, お手軽にできたら幸いです. お願い致します.
- ベストアンサー
- C・C++・C#
- Visual Stdioで、C言語のプログラミングを勉強してるのですが
Visual Stdioで、C言語のプログラミングを勉強してるのですが、 不明点があるため質問させて頂きます。 【前提条件】 ---------------------------------------------------- < TestHeader.h > typedef struct A { int (*a)(struct B* x, char* y, struct C** z); } A; ---------------------------------------------------- < TestSource.c > static int func(struct B* x, char* y, struct C** z) { return 0; } struct A D = { .a = func, }; ---------------------------------------------------- 上記の条件で、< main.c >を作成し、 main関数からfunc関数へ遷移するようにしたいです。 書籍などで調べたのですが、main関数の作成方法が分かりません。 ご教授のほど、よろしくお願いします。
- ベストアンサー
- C・C++・C#
- C言語で、他の関数で配列を書き換えられないようにしたい
下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。 main関数の側では配列aの中身を表示します。 しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。 私はfunc関数以外では、この配列の中身をいじられたくないのです。 なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。 とは言ったものの、多分できないだろうなあ、という気がします。 できないならばできないでも仕方ないのですが、確信が持てないのです。 条件があります。 funcでは表示は行なわない。 配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。 #include <stdio.h> char *func(int i) { static char a[]="AAAA"; a[i]='z'; return a; } int main(void) { int i; for(i=0; i<4; i++) { char *p=func(i); /* p[i]='X'; ★配列の中身を書き換えてしまう。 */ puts(p); } return 0; }
- ベストアンサー
- C・C++・C#
- C言語のポインターに関する警告
line[100]で 「1」が格納されていたら「a」 「2」が格納されていたら「b」 「3」が格納されていたら「c」 とout[100]に代入する関数を作りたいのですが コンパイルすると関数の部分で warning: assignment makes integer from pointer without a cast という警告がでます。 ポインターは使っていないのですが、ポインターに関する警告が出ているようで困っています。 どこが悪いのかまったくわからなくて作業が完全に止まってしまいました。 解決法をおしえてください。お願いします。 /*宣言*/ int=i; /*main関数内のfor文で使用*/ char line[100], out[100]; void change(int); /*関数*/ void change(int i) { if(line[i]=='1'){ out[10]="a\0" }if(line[i]=='2'){ out[10]="b\0"; }if(line[i]=='3'){ out[10]="c\0" } }
- ベストアンサー
- C・C++・C#
- ifstreamクラスとistreamクラス
こんにちは。 C++について質問させて下さい。 コンパイラは、Borland C++ Compiler 5.5 を使用しています。 僕は、ifstreamとfstreamクラスは、istreamクラスから派生していると認識しています。 つまり、istream型のポインタや参照は、ifstream型オブジェクトもfstream型オブジェクトも指す事ができるはずです。 その事を確認するために、まず、以下のような内容の入力マニピュレータを作成しました。 ------------------------------------------------------------ istream &alphabet(istream &stream) { char ch; do{ ch=stream.peek(); if(!isalpha(ch)) stream.get(ch); }while(!isalpha(ch) && !stream.eof() ); return stream; } ------------------------------------------------------------ この入力マニピュレータは、 ifstream fin("test.txt"); のようにして作成されたifstream型オブジェクトのfinと、 char str[80]; のようにして作成された文字列変数strに対して、 fin >> alphabet >> str; のように使うと、finに結び付けられたファイルtest.txtの現在位置(getポインタの位置)から、 次にアルファベットが現れるまで、アルファベット以外の文字を捨て去ることで、 アルファベットではじまる単語をstrに格納する事ができます。 また、この入力マニピュレータは、istream型オブジェクトへの参照を受け取るので、 fstream finout("test.txt"); のようにして作成されたfstream型オブジェクトのfinoutに対して、 fin >> alphabet >> str; のように使っても、問題なく動作しました。 つまり、上のマニピュレータの場合は、istream型オブジェクトへの参照を、 引数として受け取るようにしてあるので、istreamクラスから派生している、 ifstreamクラスのオブジェクトや、fstreamクラスのオブジェクトを渡す事ができています。 次に、以下のような内容の、ifstream型オブジェクトへの参照を受け取る関数を作成しました。 void file_to_str(ifstream &file, char *str) { const int size=1000; char temp[size]=""; do{ file.getline(temp, size); strcat(str, temp); if(!file.eof()) strcat(str, "\n"); }while(!file.eof()); } この関数は、 ifstream fin("test.txt"); のようにして作成されたifstream型オブジェクトのfinと、 char str[1000]; のようにして作成された文字列変数strに対して、 file_to_str(fin, str); のように使うと、finに結び付けられたファイルtest.txtの内容を、 文字列変数strに格納する事ができます。 ここで、上の関数のプロトタイプを void file_to_str(ifstream &file, char *str); から void file_to_str(istream &file, char *str); に変更してみると、プログラムをコンパイルした時に、以下のようなエラーが発生します。 ------------------------------------------------------------ C:\Users\kei\work\C++ >bcc32 file_to_str.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland file_to_str.cpp: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'file_to_str(std::basic_fstream<char, std::char_traits<char> >&, char *)' が未解決(C:\USERS\KEI\WORK\C++\FILE_TO_STR.OBJ が参照) ------------------------------------------------------------ file_to_str.cppには、上の関数が定義されていて、 そのmain関数の内容は、以下の通りです。 ------------------------------------------------------------ void main(void){ ifstream fin("test.txt"); char str[1000]; file_to_str(fin, str); } ------------------------------------------------------------ コンパイルエラーは、 file_to_str(fin, str); の行で発生しています。 なぜ、入力マニピュレータの時は、仮引数をistream型オブジェクトへの参照にしてもOKだったのに、 関数の場合はコンパイルエラーが発生するのかが分からず、困っています。 理屈的には、何度も言っているように、istreamクラスからfstreamクラスとifstreamクラスが派生しているので、全然問題が無いように思えます。 何か御存じの方がいらっしゃれば、是非、情報を提供して頂きたく思います。 では、よろしくお願い致します。
- ベストアンサー
- C・C++・C#
- ASCIIコードを文字に変換したい
環境はVisualStdio.Net 2008のC++ Windowsフォームアプリケーションです。 C++の経験はまったくありません。 unsigned char型の配列 box[12]の中に既にアスキーコードでデータが格納されています。(例:box[0] = 48'0') これをtextbox->textにアスキーコードではなく文字で格納し、実行時に画面で確認できるようにしたいのですが、 (char)でキャストしてもfomat()で%xや%cにしても「0」でなく「48」で出力されてしまいます。 調べたらVBにはchrという関数があるみたいなんですが、これと同じ機能を持つ関数はVC++にはないのでしょうか?
- ベストアンサー
- C・C++・C#
- C言語での関数の引数の受け渡しについて
C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo; というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。
- ベストアンサー
- C・C++・C#
- C++のtypedefについて
C++のtypedefについて C++(Borland C++ Builder V5)で以下のようなソースがありました。 『typedef int (func)(Xclass* pXcls);』 これって関数ポインタの定義でしょうか? 関数ポインタの定義の場合は以下のようになるのではないのでしょうか? 『typedef int (*func)(Xclass* pXcls);』 ご教授お願いいたします。
- ベストアンサー
- C・C++・C#
- C言語のsscanf関数の上手な使い方
C言語で、 char buf[256]; char c1[10],c2[10],c3[10]; sscanf(buf,"%s%s%s",c1,c2,c3) という、バッファから文字列を読み取るとき、 bufが、 "aa bb","aa,bb","aa, bb"の場合に、 c1 = "aa bb" c2 = "aa,bb" c3 = "aa, bb" が入るようにする方法をご存知でしたら教えてください。 %[^\"]sを使ってみたのですが、c1しか格納できませんでした。 (条件) " "かつ,で区切られた部分をパラメタに格納する。 " "内には、空白や,が入る。
- ベストアンサー
- C・C++・C#
- 関数原型宣言について
関数原型宣言について 下記のプログラムのfunc関数は、関数原型宣言 <func(int a, long b, char *c);>が述されていないのにfunc関数の仮引数の型longは、関数原型宣言が与えられるといると本に書かれていたのですが、何故でしょうか教えて頂きたい。 ******************************************** #include <stdio.h> /*--- 三つの引数を受け取る関数 ---*/ void func(int a, long b, char *c) { int x; long y; /* … */ } int main(int argc, char *argv[]) { int a = 1; char s[] = "abc"; func(a + 3, 2, s); return (0); } *************************************************************
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 istrstreamは文字列としてだけでなく使えるんですね。早速試してみたいと思います。