Visual C++ 2008 Express Editionで、現在、600kバイト程度のバイナリファイルを読み込んで特定の番地のデータだけを取り出してそれをテキスト変換してテキストボックス内に表示させるというプログラムを作成しているのですが、このことをOKwaveでどのようにコーディングするかを教えてもらったところ、


System::IO::StreamReader^ sr=gcnew StreamReader(_T("sample.txt"));


このような文を教えてもらったのですが、全く知識がなく何をやっているのかわかりません。
”sr”というのは変数で、sample.txtからstreamReader関数でsample.txt内のデータをsr変数に
入れているという感じがしますが、”System::IO::StreamReader”とか”gcnew”とかの意味がよくわかりません。
どうかご教授お願いいたします。

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

A 回答 (2件)

私は、C++で開発を行っているのではなくC#ですが・・・ さらに初心者ですが・・・



>System::IO::StreamReader
テキストの文字列を、指定のフォーマットなどで取り込む時に使用します。
srへ、格納した後は、自由に取り出すことができます。
(while文などを使用して、上から一行づつ取り出すなど)

>gcnew
gcnewは、初めてみたのでわかりませんが、メモリ管理周りっぽいですね。難しかったですが、リンク載せておきます。(2つ目)

参考URL:http://msdn.microsoft.com/ja-jp/library/akzyzwh9 …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

資料のURLも載せてもらい、ありがとうございます。
それで、​http://msdn.microsoft.com/ja-jp/library/akzyzwh9 …こちらのリンクで、同じような例文が書かれいて、

”StreamReader* objReader = new StreamReader("c:\\test.txt");”
テキスト文を”StreamReader”で宣言したobjReader変数に渡している文なんですが、
”StreamReader*”という書き方をしているのですが、”System::IO::StreamReader”という書き方とは違うのですが、これには何か理由があるのでしょうか? ”System::IO::”このコロンで挟んだりして書いたりする文というのはどうゆうことを表しているのでしょうか?

どなたかご存じでしたらご教授いただけませんでしょうか?

お礼日時:2009/05/25 13:15

C++/CLIの基本的な構文ですねー。


大雑把に書くと、System名前空間の下のIO名前空間の下の
StreamReaderクラスのインスタンスを、ガベージコレクタの対象として
(すなわちマネージヒープに)作成し、そのハンドルをsrに持ちましょう、ということです。

なので、
System::IO::StreamReaderは
System名前空間の下のIO名前空間の下のStreamReaderクラス
gcnewは
マネージヒープ上にインスタンスを作成しなさい
となるのかな。

ここら辺の意味が理解不能ならば、まずは入門用の
書籍やWebサイトを参照することをオススメします。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

”System::IO::StreamReader”このような書き方はC++言語の特徴だそうですね。

C++言語の入門学習WEBページの
http://www.asahi-net.or.jp/~yf8k-kbys/newcpp3.html
”C++によるプログラミング入門3 cinを使った入力”

に同じような記述がありました。


ちょっと基本的なことを見ながらC++プログラミングをやっていきたいと思います。

お礼日時:2009/05/25 14:27

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

QString^の^自体が何を意味しているのか、わかりません。

String^ msg = "テスト";
は、
char msg[] = "テスト";
と同じ意味でしょうか?

String^の^自体が何を意味しているのか、わかりません。
TurboCからC言語は殆ど使っていませんので、戸惑っています。

VS2005を覚えようとしているのですが、なかなか取っ付きにくいです。
意識改革できる参考書などご存知の方も教えてください。

Aベストアンサー

簡単にいうと^(ハットマーク)は実体がヒープに確保されるという意味です。

他の方の指摘の通り、これはC++/CLIと呼ばれる言語でC++で.NET Frameworkを
利用するために拡張した言語です。
.NET Frameworkのクラスはガベージコレクションで管理されている為
C++のクラスとは別に管理する必要があります。その為
^(ハットマーク)をつける事により区別しています。

ちなみにC++マネージ拡張とC++/CLIは違います。
2003以前の仕様をC++マネージ拡張と言い
2005以降のものをC++/CLIと言います。

System::Stringはスタックに置くことは出来ないので
System::String^ msg;
となります。

System::Drawing::Color等は
スタックに置くこともヒープに置くことも可能です。
System::Drawing::Color^ col1 = gcnew System::Drawing::Color();
System::Drawing::Color col2;
int test1 = col1->R;
int test2 = col2.R;

C++/CLIの参考書としては
中 博俊著 「実践 C++/CLI 極めるための基礎と実用テクニック」
がありますが、
まずC/C++を理解していることが前提になっていますので
もしC/C++の理解に不安があるようなら先に勉強した方が良いでしょう。
有名な書籍だと「独習C」と「独習C++」があります。

前述の通りC++/CLIは.NET Frameworkを使うためのものですが
.NET Frameworkを使いたいのであればC#の方が良いと思います。

簡単にいうと^(ハットマーク)は実体がヒープに確保されるという意味です。

他の方の指摘の通り、これはC++/CLIと呼ばれる言語でC++で.NET Frameworkを
利用するために拡張した言語です。
.NET Frameworkのクラスはガベージコレクションで管理されている為
C++のクラスとは別に管理する必要があります。その為
^(ハットマーク)をつける事により区別しています。

ちなみにC++マネージ拡張とC++/CLIは違います。
2003以前の仕様をC++マネージ拡張と言い
2005以降のものをC++/CLIと言います。

Syst...続きを読む

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

Q【C++/CLI】String型文字列の位置を指定して値を取り出す

VC++2005、.NET2.0、C++/CLIにてWindowsアプリを作成しています。

String型に格納された文字列の、位置を指定して値を取り出すには、
どのような方法を用いればよいのでしょうか?
基本的な質問で申し訳ありませんが、ご教示よろしくお願い致します。

例)
String^ st = "abあいcde";
//四番目の値を取り出す⇒「い」を取り出す

Aベストアンサー

こうですか?

String^ st = "abあいcde";
String^ st2 = st->Substring(3, 1);

あとこんな方法も・・・
String^ st = "abあいcde";
array<wchar_t>^ ary = st->ToCharArray();
wchar_t ch = ary[3];

QC#のループでtextboxに値を入れる方法

Nameが

textbox1
textbox2
...
textbox10

と10個のtextboxがあったとして、

このそれぞれのtextに値を入れたいのですが、
1個ずつ書くのではなく、forとかで入れることは出来ますか?

たとえば以下のように、ループで○の部分を変更していくことは可能なのでしょうか?
for (int i=1; i<=10; i++)
{
textbox○.text = i.ToString();
}


よろしくお願いします。

Aベストアンサー

>基本的にはボタンのクリックイベントの中に書いています。

こちらでは問題ありませんけど…なにが 違うんですかねぇ…。

>フォームのインスタンスで実行するなら、

インスタンスではなくコンストラクタでした。
まぁ、InitializeComponent()を実行した後であれば、可能な……ハズなんですけど。

半角での名前は、大文字小文字は区別しないで動作してくれるようですが、
いわゆる全角と半角は区別するでしょうから、その辺りの違いですかねぇ……。


人気Q&Aランキング

おすすめ情報