アプリ版:「スタンプのみでお礼する」機能のリリースについて

今、Visual C++2008 Express Editionを使用して、ファイルダイアログを使用して用意した配列にファイル内容を記憶させる簡単なプログラムを作成しています。

プログラムの流れは以下のとおりです。
1.ボタンをクリックする。
2.ファイルダイアログを表示する。
3.選択されたファイル名の内容を用意した配列に記憶する。

1,2はできたのですが、選択されたファイル(主にCSVファイル)の内容を配列に記憶させる方法がわかりません。
どうしたらよいのでしょうか。教えてください。

以下にボタンを押したときの動作を掲載しますのでお願いいたします。
=========================
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//ファイル内容を記憶させる配列
double x[1024], y[1024];
//ファイルを読み込むときのループインデックス
                   int i=0;
                  //ファイル名を格納する変数 
                  String^ fname;
              ファイルを開くためのダイアログを用意
OpenFileDialog^ dlg = gcnew OpenFileDialog();
                //フィルターの内容を設定dlg->Filter::set("CSVファイル(*.csv)|*.csv");
             //ダイアログタイトルの設定
dlg->Title::set("開くファイルを選択してください。");
             //ダイアログの表示
dlg->ShowDialog();
            //ファイル名を取得して格納
   fname=dlg->FileName;
       /**********************************************
          ここに上記の「fname」のファイルを読み込む処          理がくる
             ********************************/ }

A 回答 (1件)

 こんにちは。

System::IO::StreamReaderで処理されては如何でしょう。

 「System::IO::StreamReader」
 http://msdn.microsoft.com/ja-jp/library/system.i …

 以下は「,」で区切って配列にしまっていきます。
 なるべくCLIのarray<T, d>を使用して、拡張割り当てをさせるようにした方が、何かと安全で便利です。参考程度に。

array<System::String^>^ ArrayFromFile(System::String^ sFileName)
{
using namespace System::IO;

//配列のインスタンスだけは割り当てる
array<System::String^>^ arrStr = gcnew array<System::String^>(0);
try
{
StreamReader^ sr = gcnew StreamReader(sFileName);
while(!sr->EndOfStream)
{
//ライン読み込み
System::String^ sLine = sr->ReadLine();

int count = 0;
for each(System::Char wc in sLine)
{
//一致しないのでカウンタを回す
if(wc != ',')
{
++count;
continue;
}

//一致したので切り抜いて配列に入れる
//配列を+1拡張
array<System::String^>::Resize(arrStr, arrStr->Length + 1);

//,までの文字を切り抜いて配列に入れる(sLineは影響を受けないので改めて消す必要がある)
arrStr->SetValue(sLine->Substring(0, count), arrStr->Length - 1);

//,も含めた文字の分だけラインから消す
sLine = sLine->Remove(0, count + 1);
count = 0;
}
}
}
catch (Exception^ e)
{
//しくじった
}
return arrStr;
}

//使用する時
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

//ファイル内容を記憶させる配列
//double x[1024], y[1024];関数化したので此れはいらない

//ファイルを読み込むときのループインデックス
//int i=0;関数化したので此れはいらない

//ファイル名を格納する変数 
String^ fname;

ファイルを開くためのダイアログを用意
OpenFileDialog^ dlg = gcnew OpenFileDialog();

/フィルターの内容を設定 dlg->Filter::set("CSVファイル(*.csv)|*.csv");
//ダイアログタイトルの設定
dlg->Title::set("開くファイルを選択してください。");

//ダイアログの表示
dlg->ShowDialog();

//ファイル名を取得して格納
fname=dlg->FileName;

/**********************************************
ここに上記の「fname」のファイルを読み込む処理がくる
***********************************************/

//しくじると長さ0の配列が返ってくる
array<System::String^>^ arrStr = ArrayFromFile(fname);

//しくじった
if(arrStr->Length == 0)
{
//何かする
}

//成功したので、arrStrを使う
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
StreamReaderを使ったら、あっさりできるようになりました。
アドバイスありがとうございます。

お礼日時:2009/02/20 14:32

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