- ベストアンサー
C++によるファイルの読み込み方法とは?
- Visual C++2008 Express Editionを使用して、ファイルダイアログを表示し、選択されたファイルの内容を配列に記憶させる方法がわからない。
- プログラムの流れは、ボタンをクリックし、ファイルダイアログを表示し、選択されたファイル名の内容を用意した配列に記憶する。
- ファイルを開くためのダイアログを用意し、指定されたCSVファイルを読み込む処理が必要。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。System::IO::StreamReaderで処理されては如何でしょう。 「System::IO::StreamReader」 http://msdn.microsoft.com/ja-jp/library/system.io.streamreader.aspx 以下は「,」で区切って配列にしまっていきます。 なるべく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を使う }
お礼
回答ありがとうございます。 StreamReaderを使ったら、あっさりできるようになりました。 アドバイスありがとうございます。