• ベストアンサー

C++のstream(ストリーム)について

簡単に聞きます。すごく困ってます。 func(istream** out, char *in); C++(VC)で上のようなchar*のバッファをistreamで出力するような関数を作成したいです。 が、その方法が良く分かりません。 istreamはすでに格納された物から読み込むことにしか したことがありません。 調べてもさっぱりです・・・。 どなたか詳しい方がいらっしゃいましたら是非ご教授下さい!

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.8

No.4です。 > 文字列だけではなく、バイナリデータも考えてます。 istrstreamの扱う文字列はC標準のヌル終端文字列ではなく単なるchar配列だと思います。 istrstream( char* pch, int nLength )形式のコンストラクタでistrstreamを構築すればやりたいことができるんじゃないかと思いますが。

goopon
質問者

お礼

回答ありがとうございます。 istrstreamは文字列としてだけでなく使えるんですね。早速試してみたいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (8)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.9

#6補足>読み込んだbufをstreamで提供 であれば、#8で言われるようにistrstream で良いんじゃないでしょうか 例えば、 #include <strstream> #include <cstdio> #include <cstring> using namespace std; int main(void){ char buff[256]; for(int i=0;i<256;i++){ buff[i]=(char)i; } istrstream iss(buff, 256);//buff には、既に読み込まれているバイナリデータ unsigned char readBuff[16]; while(true){ memset(readBuff, 0, 16); if(iss.read(readBuff, 16).eof())break;//istrstream からの読込 for(int i=0;i<16;i++){ printf("%02X ", readBuff[i]); } printf("\n"); } return(0); } みたいな感じで、、 でも、元がデータファイルなんだったら、 ifstream をそのまま使えばいいような気がします。

goopon
質問者

お礼

回答ありがとうございます。 サンプルコードまで書いてもらって助かります! 試して見たいと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.7

#6の方の補足要求に対する回答をお待ちするとして、 もしもstrstreamを使うならstringstreamの方をお勧めしておきます。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.6

#2>istreamで出力したいです。ostreamを使ってうまいことできないんでしょうかね。 ? 私も、istrstream なのかなと思いますが・・ 質問者の考える理想的な使い方というか動作を 擬似コードでいいので説明していただけないでしょうか

goopon
質問者

補足

回答ありがとうございます。 void func(istream** out, char *in) {   char* buf;   Read(&buf); /* すでにあるバイナリファイルの読み込み(例えばgif/jpeg) */   /* … */   *out = ??; /* ←読み込んだbufをstreamで提供 */ } ということができればと思います。現実的ではないのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • amru05
  • ベストアンサー率63% (33/52)
回答No.5

istream:入力に使用します。 ostream:出力に使用します。 iostream:入出力に使用します。 質問者の意図は入出力したいストリームは? と、思えます。その場合はiostreamを使用する事になります。

参考URL:
http://www.kab-studio.biz/Programing/Codian/iostream/01.html
goopon
質問者

補足

回答ありがとうございます。 URL参考になります。 抜けていたのですが、バイナリファイルにも対応する必要があるんです。

全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

文字列を入力ストリームに登録して、その入力ストリームからデータを取り出したい(要するにsscanfのようなこと)、ということで良いでしょうか。 それならistrstreamを使えるかもしれません。

参考URL:
http://www.microsoft.com/japan/developer/library/vclang/_iostream_istrstream.htm
goopon
質問者

補足

すみません。補足です。 文字列だけではなく、バイナリデータも考えてます。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

ど~いうときに istream に出力する必要があるのか, 全く見当がつきません. 端的には「考え方からして間違っている」類. 小手先で変なことするより, 考え直した方がいいと思う.

goopon
質問者

補足

回答ありがとうございます。 >ど~いうときに istream に出力する必要があるのか, istream型はユーザが受け取る場合に良く使用されると思うのですが(ifstream?ファイルデータ?) 例えば、こちらで保持しているバッファをユーザにstream型で提供するような場合で考えてもらえればと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>istreamで出力する ostream では?

goopon
質問者

補足

↓にも書きましたが、istreamで出力したいです。ostreamを使ってうまいことできないんでしょうかね。

全文を見る
すると、全ての回答が全文表示されます。
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> C++(VC)で上のようなchar*のバッファをistreamで出力するような関数を作成したいです。 > が、その方法が良く分かりません。 istreamは「入力用ストリーム」なのでそんなことはできません。 出力用ストリームはostreamです。 http://www.geocities.jp/ky_webid/cpp/library/033.html

goopon
質問者

補足

回答ありがとうございます。 istreamでは不可能ですか。 ostreamからistreamへ変換ってできないんでしょうかね。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【C++】ストリームオブジェクトを切り替える方法に

    ただ今C++を勉強中です. 関数を作成する際,引数を以下の様にして出力先を切り替えるようにしています. void Function(ostream &out) {    out << "文章"; } 引数を変えることで,標準出力やファイル出力を選択出来て重宝しています. でも,最近はある条件の時はどこにも出力させないという処理は出来ないかと考えております. 例えば, 条件がAの時はcout, 条件がBの時はfout, 条件がCの時は出力させない と言ったようにです. 何か良い方法はあるでしょうか? 引数にostreamを入れた様々な関数を多用しているため, お手軽にできたら幸いです. お願い致します.

  • 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のプログラムでは、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言語のポインターに関する警告

    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" } }

  • 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クラスが派生しているので、全然問題が無いように思えます。 何か御存じの方がいらっしゃれば、是非、情報を提供して頂きたく思います。 では、よろしくお願い致します。

  • 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言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • C++のtypedefについて

    C++のtypedefについて C++(Borland C++ Builder V5)で以下のようなソースがありました。 『typedef int (func)(Xclass* pXcls);』 これって関数ポインタの定義でしょうか? 関数ポインタの定義の場合は以下のようになるのではないのでしょうか? 『typedef int (*func)(Xclass* pXcls);』 ご教授お願いいたします。

  • 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しか格納できませんでした。 (条件) " "かつ,で区切られた部分をパラメタに格納する。 " "内には、空白や,が入る。

  • 関数原型宣言について

    関数原型宣言について 下記のプログラムの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); } *************************************************************