テキストファイル読み込み行数をStreamReaderで宣言したreadで知る方法は?

このQ&Aのポイント
  • StreamReaderでテキストファイルを読み込む際に、行数を知る方法を教えてください。
  • テキストファイルを読み込んで行数分のクラスの配列を宣言したいです。どのように実装すれば良いでしょうか?
  • StreamReaderを使用してファイルを読み込む際に、読み込む行数を事前に知る方法があるか教えてください。
回答を見る
  • ベストアンサー

StreamReaderで読み込んだテキストの行数

テキストファイルを読み込んで行数文のクラスの配列を宣言したいと思っているのですが、 Wireless_unit Wireless_unit[32]; array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); 行数がわからないので、StreamReader^で宣言したreadで知る方法はありませんでしょうか? 下のような関数でファイルを読み込んでいます。 private: bool LoadCsvFile02( String^ path ) { StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); ----(中略)------------------------------------------------

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

アクセス自体はふつーの配列と同じように行えます。

diy_sunny
質問者

お礼

回答頂きありがとうございます!。 こんな感じのやり方でできました。助かります! List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig(); array<String^,2>^ addr_eeprom02 = gcnew array<String^,2>(2000, 2); while(( data = reader->ReadLine()) != nullptr ) { // カンマ区切りで分解 array<String^>^ split = data->Split( separator ); Wireless_unit_sig_temp->day_name = split[0]; Wireless_unit_sig_temp->month = split[1]; Wireless_unit_sig_temp->day = split[2]; Wireless_unit_sig_temp->time = split[3]; Wireless_unit_sig_temp->year = split[4]; Wireless_unit_sig_temp->cmd1 = split[5]; Wireless_unit_sig_temp->cmd2 = split[6]; Wireless_unit_sig_temp->ID = split[7]; Wireless_unit_sig_temp->sig1 = split[8]; Wireless_unit_sig_temp->sig2 = split[9]; Wireless_unit_sig_temp->batt_mount = split[10]; Wireless_unit_sig_temp->m_rssi = split[11]; Wireless_unit_sig_temp->s_rssi = split[12]; Wireless_unit_sig_temp->version = split[13]; Wireless_ID_str02->Add(Wireless_unit_sig_temp); Wireless_unit_sig_temp->m_rssi = split[11]; Wireless_unit_sig_temp->s_rssi = split[12]; Wireless_unit_sig_temp->version = split[13]; Wireless_ID_str02->Add(Wireless_unit_sig_temp);

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

そーゆーのを事前に知らなくてもいいように動的配列クラスが存在します。 とりあえずListジェネリッククラスを見とけばいいでしょう。 #このところこればっか言ってるような気がする

diy_sunny
質問者

お礼

回答頂きありがとうございます!  Listジェネリッククラスというのはとても便利そうですね。 追加で質問させて頂きたいのですが、 List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); このような”Wireless_unit_sig”クラスの配列を作ってみました。 このときに、このクラス内にある Wireless_ID_str02->day_name Wireless_ID_str02->time などなどの変数に値を代入したい場合はどのようにしたらよいのでしょうか? どうぞ、よろしくお願い致します。 クラスの内容は次のようなものです。 ref class Wireless_unit_sig { private: public: String^ day_name; String^ month; String^ day; String^ time; String^ year; String^ cmd1; String^ cmd2; String^ ID; String^ sig1; String^ sig2; String^ batt_mount; String^ m_rssi; String^ s_rssi; String^ version; public: Wireless_unit_sig() { day_name = "test"; month = "test"; day = "test"; time = "test"; year = "test"; cmd1 = "test"; cmd2 = "test"; ID = "test"; sig1 = "test"; sig2 = "test"; batt_mount = "test"; m_rssi = "test"; s_rssi = "test"; version = "test"; }

関連するQ&A

  • StreamReaderで読み込んだファイルの行数

    StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); このreaderに20000行程度あるテキストファイルを読み込んだのですが、正確な行数を取得する方法はあるのでしょうか? どうぞ、ご教授よろしくお願い致します。

  • クラスを配列で宣言してデバッグ中にエラーが出る。

    今、"Wireless_unit_str"というクラスをWireless_ID_str02 で宣言してこれを32個分宣言して Wireless_ID_str02[i]->Wireless_ID_str = "test"; 32個分のWireless_ID_str の中に全部”test” と代入してみようとしたのですが、デバッグ最中にその文を実行しようとすると、つぎのようなエラーが出ます。 (エラー内容) ”'System.NullReferenceException' のハンドルされていない例外が HomeBank.exe で発生しました。 追加情報: オブジェクト参照がオブジェクト インスタンスに設定されていません。” 解決する方法はないでしょうか? array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); for(i=0; i < 32;i++) { Wireless_ID_str02[i]->Wireless_ID_str = "test"; } 作成したクラス”Wireless_unit_str”の内容 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: DateTime date; // 日付 String^ name; // 品名 String^ kind; // 分類 int money; // 金額 public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • unsighed charの数値をstringに

    for(k=0;k < 6;k++) { Wireless_ID_str02[i]->Wireless_ID_str += Wireless_unit[i].wireless_id[k].ToString("X2"); } このようなブログラムを使ってWireless_unit[i].wireless_id[k] unsighed charの次の数値 Wireless_unit[i].wireless_id[0] = 1; Wireless_unit[i].wireless_id[1] = 1; Wireless_unit[i].wireless_id[2] = 1; Wireless_unit[i].wireless_id[3] = 1; Wireless_unit[i].wireless_id[4] = 1; Wireless_unit[i].wireless_id[5] = 1; これを stringの Wireless_ID_str02[i]->Wireless_ID_str この中に”111111” というように代入していきたいのですが、 実際に入ってきたのは Wireless_ID_str02[i]->Wireless_ID_str = ”test313131313131” となりました。 Wireless_ID_str02[i]->Wireless_ID_str = ”111111” という風に代入する方法はありませんでしょうか。 ”Wireless_unit”というのは Wireless_unit Wireless_unit; というので宣言しています。 struct Wireless_unit { unsigned char wireless_id[6]; unsigned char use; unsigned char tampa_sig_m1; unsigned char tampa_sig_m2; unsigned char tampa_sig_m34_set; unsigned char tampa_sig_m34_reset; unsigned char battlow_sig_m1; unsigned char battlow_sig_m2; unsigned char battlow_sig_m34_set; unsigned char battlow_sig_m34_reset; unsigned char sch_sig_m1; unsigned char sch_sig_m2; unsigned char sch_sig_m34_set; unsigned char sch_sig_m34_reset; unsigned char ch1_use; unsigned char ch1_emg_sig_m1; unsigned char ch1_emg_sig_m2; unsigned char ch1_emg_sig_m34_set; unsigned char ch1_emg_sig_m34_reset; unsigned char ch2_use; unsigned char ch2_emg_sig_m1; unsigned char ch2_emg_sig_m2; unsigned char ch2_emg_sig_m34_set; unsigned char ch2_emg_sig_m34_reset; }; また、 ”Wireless_ID_str02”は array<Wireless_unit_str^>^ Wireless_ID_str02 = gcnew array<Wireless_unit_str^>(32); このように宣言しています。 namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Wireless_unit_str { private: public: String^ Wireless_ID_str; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Wireless_unit_str() { Wireless_ID_str = "test"; } }; }

  • Listジェネリッククラスのやり方がわからない。

    リストジェネリッククラスを使って、テキストファイルから取得したたくさんのデータ(数がわからない)を整理しながらWireless_ID_str02というデータの中に整理しながら入れていきたいんです。 下のプログラムでビルドはできるのですが、デバッグで見ていくと、i=20000ぐらいまで行くのですが、すべてのデータが全く同じデータで、決まって、テキストファイル内の一番最後の行のデータになってしまってました。 どうして、全く同じデータが収納されてしまうのか教えて頂けないでしょうか? どうぞ、よろしくお願いします。 List<Wireless_unit_sig^>^ Wireless_ID_str02 = gcnew List<Wireless_unit_sig^>(); Wireless_unit_sig^ Wireless_unit_sig_temp = gcnew Wireless_unit_sig(); i=0; while(( data = reader->ReadLine()) != nullptr ) { // カンマ区切りで分解 array<String^>^ split = data->Split( separator ); #if 1 Wireless_unit_sig_temp->day_name = split[0]; Wireless_unit_sig_temp->month = split[1]; Wireless_unit_sig_temp->day = split[2]; Wireless_unit_sig_temp->time = split[3]; Wireless_unit_sig_temp->year = split[4]; Wireless_unit_sig_temp->cmd1 = split[5]; Wireless_unit_sig_temp->cmd2 = split[6]; Wireless_unit_sig_temp->ID = split[7]; Wireless_unit_sig_temp->sig1 = split[8]; Wireless_unit_sig_temp->sig2 = split[9]; Wireless_unit_sig_temp->batt_mount = split[10]; Wireless_unit_sig_temp->m_rssi = split[11]; Wireless_unit_sig_temp->s_rssi = split[12]; Wireless_unit_sig_temp->version = split[13]; #endif Wireless_ID_str02->Add(Wireless_unit_sig_temp); i++; }

  • 【C#】StreamReaderクラスのエンコード

    こんばんは。 .NetFramework1.1のStreamReaderクラスを使用して、csvファイルを読み込んでいるのですが、 エンコードでShift_JISを指定しても、"€"などの環境依存文字がそのまま取得されてしまいます。 Shift_JISに存在しない文字は文字化けして取得されるものだと思っていましたが、違うのでしょうか? DBの文字コードがShift_JISなのでこのままDBへ渡すとエラーになってしまい困っています。 ご教授下さい。宜しくお願いします。 -- ソース ---------------------------------------------- StreamReader sr = new StreamReader(path,Encoding.GetEncoding("Shift_JIS")); string str = sr.ReadLine();

  • VC++でファイルへの書き込みについて

    VC++にて、ファイルへの書き込みを行っているのですが、どうもうまくいきません。 Form.h //ファイル->開く private: System::Void 開くOToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) { //開くダイアログ表示 OpenFileDialog^ dlg = gcnew OpenFileDialog(); dlg -> Filter = "CSV形式(*.csv)|*.csv|すべてのファイル(*.*)|*.*"; if (dlg -> ShowDialog() != System::Windows::Forms::DialogResult::OK){ return; } //CSV形式でファイルを読み込み LoadCsvFile( dlg -> FileName ); } //ファイルの読み込み private: bool LoadCsvFile( String^ path ){ //ファイルをオープン StreamReader^ reader = gcnew StreamReader( path, System::Text::Encoding::GetEncoding("shift-jis")); //ファイル読み込み String^ data; data = reader -> ReadLine(); st = from_cli(data); //dataをグローバル変数std::string = stに変換 reader -> Close(); return true; } //System::String -> std::string変換用 std::string from_cli(String^ input, Encoding^ encoding) { array<Byte>^ result = Encoding::Convert(Encoding::Unicode, encoding, Encoding::Unicode->GetBytes(input)); if ( result->Length != 0 ) { pin_ptr<unsigned char> pin = &result[0]; return std::string(reinterpret_cast<char*>(pin), result->Length); } return std::string(); } //ボタンクリックイベント private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { std::ofstream ofs; ofs.open( "test.txt" ); ofs << st << std::endl; ……(1) ofs.close(); } csvファイルを読み込み後、ボタンクリックイベントを行ってもtext.txtの内容が書き変わりません。 (1)の部分をofs << "test" << std::endl;に変更したり、 button1_Click内で変数st2を宣言し、 ofs << st2 << std::endl;に変更すると、問題無くファイルへの書き出しが行えます。 文字コード等が関わっているのでしょうか? 御助言の程、よろしくお願いします。

  • C#からテキストファイルへの出力について

    お世話になります。 .NET C#で開発をしております。 下記のコードで、テキストファイルへ書き出す際、 何故か最初の1レコード目が書き出されない現象が 起きてしまいます。 どなたかご親切な方、ご教示頂きたく宜しくお願い致します。     記 public static int Syori() { string MitxtPath = @"D:\MData"; string SotxtPath = @"D:\SData"; for (int x = 0; x < 2; x++) { if (x == 0) { FileName = "\\JF01.txt"; } else if (x == 1) { FileName = "\\JS05.txt"; } FileStream fs = new FileStream(MitxtPath + FileName, FileMode.Open); StreamReader r = new StreamReader(fs, Encoding.GetEncoding("Shift_JIS")); if (r.ReadLine() != null) { StreamWriter textFile; textFile = new StreamWriter(SotxtPath + FileName, true, Encoding.GetEncoding("Shift_JIS")); //レコードを書き込む string ZanData; string newData; byte[] bytesData; while ((OkuriNokosi = r.ReadLine()) != null) { bytesData = System.Text.Encoding.GetEncoding(932).GetBytes(ZanData); newData = System.Text.Encoding.GetEncoding(932).GetString(bytesData); textFile.WriteLine(newData); } textFile.Close(); r.Close(); } }

  • インスタンス化について

    .NETでのインスタンス化について .NETでプログラムの勉強をしています。インスタンスについてお教えください。 ↓では、「sr」はnewキーワードを使ってインスタンス化しています。 ********************************************************************************** //"C:\test.txt"をShift-JISコードとして開く System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); //内容をすべて読み込む string s = sr.ReadToEnd(); //閉じる sr.Close(); //結果を出力する Console.WriteLine(s); ↓では、「enc」はnewキーワードを使ってインスタンス化していません。 ********************************************************************************** //読み込むテキストファイル string textFile = "C:\\text.txt"; //文字コード(ここでは、Shift JIS) System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //テキストファイルの中身をすべて読み込む string str = System.IO.File.ReadAllText(textFile, enc); //行ごとの配列として、テキストファイルの中身をすべて読み込む string[] lines = System.IO.File.ReadAllLines(textFile, enc); ********************************************************************************** 質問1: インスタンス化させる時にはnewキーワードが必要だと思っていましたが、「enc」はnewキーワードが使用されていません。 なぜでしょうか? 質問2: System.IO.StreamReader sr = new System.IO.StreamReader( @"C:\test.txt", System.Text.Encoding.GetEncoding("shift_jis")); 上記のように、newと同時にパスやエンコーディングを引数として渡しています。この事をコンストラクタとよぶのでしょうか? Googleで調べていますが、いまいち意味がわかりません・・・物凄くひらたくいうとどういったことなのでしょうか?何かプログラムではない、一般的な事で例えて頂けるとありがたいです。 宜しくお願い致します。

  • C++でのtxtファイル読み込みについて

    こんにちは。 C++でのtxtファイル読み込みについて質問させていただきます。 下記のようなコードを使ってtxtファイルを読み込もうとしています。 private: System::Void toolStripButton2_Click(System::Object^ sender, System::EventArgs^ e) { array<int>^ x=gcnew array<int>(103*300); array<int>^ y=gcnew array<int>(103*300); int num=int::Parse(numericUpDown4->Text); String^ fileName="outputx"+ num.ToString() +".txt"; String^ string1; StreamReader^ sreader1; StreamReader^ din = File::OpenText(fileName); array<String^>^ sub_string; //指定したファイル名でStreamReaderを設定する try{ sreader1=gcnew StreamReader(fileName); }catch(Exception^ ex){ MessageBox::Show("!"); return; } //x[i]の読み込み String^ str; int count = 0; while ((str = din->ReadLine()) != nullptr) { string1=sreader1->ReadLine(); //StreamReaderに1行読み込む sub_string=string1->Split(' '); //コンマで分割する x[count]=Convert::ToInt32(sub_string[1]); y[count]=Convert::ToInt32(sub_string[2]); count++; } Bitmap^ bmap_dst=gcnew Bitmap(104,301); for(int j=0;j<301;j++) for(int i=0;i<104;i++){ bmap_dst->SetPixel(i,j,Color::FromArgb(255,255,255));} for(int k=0;k<count;k++){ bmap_dst->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));} pictureBox1->Image = bmap_dst; pictureBox2->Image = bmap_dst; //y座標 fileName="outputy"+ num.ToString() +".txt"; String^ string2; StreamReader^ sreader2; din = File::OpenText(fileName); array<String^>^ sub_string2; //指定したファイル名でStreamReaderを設定する try{ sreader2=gcnew StreamReader(fileName); }catch(Exception^ ex){ MessageBox::Show("!"); return; } //x[i]の読み込み String^ str2; count = 0; while ((str2 = din->ReadLine()) != nullptr) { string2=sreader2->ReadLine(); //StreamReaderに1行読み込む sub_string2=string2->Split(' '); //コンマで分割する x[count]=Convert::ToInt32(sub_string2[1]); y[count]=Convert::ToInt32(sub_string2[2]); count++; } Bitmap^ bmap_dst2=gcnew Bitmap(104,301); for(int j=0;j<301;j++) for(int i=0;i<104;i++){ bmap_dst2->SetPixel(i,j,Color::FromArgb(255,255,255));} for(int k=0;k<count;k++){ bmap_dst2->SetPixel(x[k],y[k],Color::FromArgb(0,0,0));} pictureBox3->Image = bmap_dst2; pictureBox4->Image = bmap_dst2; } また、読み込むtxtファイルは下記のようなものです。(長いので途中部分のみ)      1    287      1    288      2    107      2    108      2    109      2    110 これをビルドすると”入力文字列の形式が正しくありません”と出てしまいます。 また、下記のようなtxtファイルだと問題なく読み込むことができます。 9 164 9 165 9 166 10 151 10 152 10 153 10 154 プログラミングのどこがいけないのでしょうか? 説明不足かと思いますが、ご回答よろしくおねがいします。

  • C#での文字置換について

    hoge.txt -------------- #abc_1 111111111 222222222 333333333 #abc_2 111111111 222222222 333333333 #abc_3 ... -------------- StreamReader sr = new StreamReader("hoge.txt", Encoding.GetEncoding("UTF-8")); sr.ReadToEnd(); でファイルを読み込み#abc_1から#abc_2の間の 111... 222... 333... というのを削除して 出力したいのですが分かりません。 (同様に#abc_2から#abc_3の間も削除します) つまり出力は #abc_1 #abc_2 #abc_3 となるように。 宜しくお願いします

専門家に質問してみよう