- PR -

リストビューの項目取得、書込みの方法を御教授願います

投稿者投稿内容
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-05-05 00:02
引用:

くまさんさんの書き込み (2006-05-04 23:53) より:
S-JISのテキストで出力したいのですが。


ファイルの書き込みはStreamWriterクラスを使います。エンコードはEncodingクラスを使います。

サンプル
コード:

#using <System.dll>

using namespace System;
using namespace System::Text;
using namespace System::IO;

int main( array< String^ >^ args )
{
StreamWriter^ sw = nullptr;
try
{
sw = gcnew StreamWriter( L"test.txt", false, Encoding::GetEncoding( L"Shift_JIS" ) );
for ( int i = 0; i < 10; i++ )
{
sw->WriteLine( L"ABC" );
}
}
catch ( Exception^ ex )
{
Console::WriteLine( ex->Message );
}
finally
{
if ( sw != nullptr ) sw->Close();
}
}



saveFileDialogからも Streamオブジェクトが取得できると思いましたので、そこから
StreamWriteオブジェクトを作成してもいいです。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-05-05 00:05 ]
くまさん
会議室デビュー日: 2006/05/04
投稿数: 9
投稿日時: 2006-05-05 12:54
Blueさん、御教授ありがとうございました
お蔭様で試行錯誤しましたがStreamWriteオブジェクトを作成して実装することもできました。
以下サンプルです
コード:
Stream^ myStream;
using ::System::Windows::Forms::DialogResult;
SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog();
saveFileDialog1->Filter = "All files (*.*)|*.*|txt files (*.txt)|*.txt" ;
saveFileDialog1->FilterIndex = 2 ;
saveFileDialog1->RestoreDirectory = true ;
if(saveFileDialog1->ShowDialog() == DialogResult::OK)
{
	if((myStream = saveFileDialog1->OpenFile()) != nullptr)
	{
		StreamWriter^ sw = gcnew StreamWriter(myStream); 
		for each ( ListViewItem^ itm in listView1->Items )
		{
			//itm->Text で一番左のテキストが
			sw->Write(itm->Text, ("Shift_JIS"));
			int i;
			//itm->SubItems[ i ]->Text で左から2番目から順にテキストが取得できます。
			for (i=1; i < itm->SubItems->Count; i++)
			{
				sw->Write(itm->SubItems[ i ]->Text, ("Shift_JIS"));
			}
		}
		sw->Close(); 
		myStream->Close();
	}
}


Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-05-05 14:36
引用:

くまさんさんの書き込み (2006-05-05 12:54) より:
コード:

sw->Write(itm->Text, ("Shift_JIS"));




本当にこれで、Shift_JISコードのファイルが出来てきますか?(UTF-8ではないですか?)
というか StreamWriter::Writeメソッドに文字コードを指定する引数はありませんよ。
それと、続けて Write していますが、区切り文字とか改行とか必要ないのでしょうか?

コード:

// カンマ区切りで保存する例
StreamWriter^ sw = gcnew StreamWriter( myStream, Encoding::GetEncoding( L"Shift_JIS" ) );
for each ( ListViewItem^ itm in listView1->Items )
{
sw->Write( itm->Text ); // itm->SubItems[ 0 ] でもOKでした。
for ( int i = 1; i < itm->SubItems->Count; i++ )
{
sw->Write( L"," + itm->SubItems[ i ]->Text );
}
sw->Write( L"\n" );
}
sw->Close();



それと、実際書いているソースをサンプルとはいわないと思うのですが。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-05-05 14:42 ]
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-05-05 17:46
くまさん
こんにちは。

失礼かもしれませんが、理解していないで、
手当たり次第にやっていませんか?

以下、余計なお世話かもしれませんが・・・
C++/CLIの仕様をご一読されたことはありますか?
また、MSDNを読んで書いてあることが理解できますか?

もし、これらについて、不安があるようでしたら、
C++/CLIなどや.Netの参考書籍をご一読されることをオススメします。
遠回りなようでもその方が学習になると思います。

以上、老婆心ながら。
くまさん
会議室デビュー日: 2006/05/04
投稿数: 9
投稿日時: 2006-05-05 21:35
Blueさんsiaさんお世話になります

>>本当にこれで、Shift_JISコードのファイルが出来てきますか?(UTF-8ではないですか?)
>>というか StreamWriter::Writeメソッドに文字コードを指定する引数はありませんよ。
エクセルのCSVファイルとして開くと文字が化けていましたが確かに日本語が文字化け
していたのですがテキストファイルでは正常に表示できたので、てっきりtxtで保存する
場合とcsvで保存する場合はエンコードが異なるのだろうかと、邪推していました
>>それと、続けて Write していますが、区切り文字とか改行とか必要ないのでしょうか?
カンマは入れていましたが、使い方がBlueさんとは違っていました
>>それと、実際書いているソースをサンプルとはいわないと思うのですが。
おっしゃる通りです

>>失礼かもしれませんが、理解していないで、
>>手当たり次第にやっていませんか?
まるっきり理解できていないとは思いませんが、完全には理解できていないと思います
確かにMSDNの読み方は不慣れなので勘にたよる部分が多いのも事実否めません
>>C++/CLIなどや.Netの参考書籍をご一読されることをオススメします。
お勧めの書籍があれば教えていただけませんか

それから、一点教えて頂きたいのですが、プログラムがアクセスするファイルの中に
、名前を付けて保存をするファイルが含まれる場合やプログラムを二重起動をした場合など
'System.IO.IOException' のハンドルされていない例外が mscorlib.dll で発生しました。

別のプロセスで使用されているため、プロセスはファイル〜にアクセスできません。

が発生するのですが、そういう場合
try , throw , catchを使うのでしょうが、このプログラムの場合はどのようにすべきなのでしょうか?
御教授お願いできないでしょうか。


[ メッセージ編集済み 編集者: くまさん 編集日時 2006-05-05 21:40 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-05 21:39
引用:

くまさんさんの書き込み (2006-05-05 21:35) より:

別のプロセスで使用されているため、プロセスはファイル〜にアクセスできません。
が発生するのですが、そういう場合
try , throw , catchを使うのでしょうが、このプログラムの場合はどのようにすべきなのでしょうか?


catch で Sleep してから許容範囲回数で再トライですね。
二重起動については防止はできますが、根本的な解決にはなりません。

それと、ストリームは finally で確実に Close されるようにするのが定石です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
くまさん
会議室デビュー日: 2006/05/04
投稿数: 9
投稿日時: 2006-05-06 10:13
じゃんぬねっとさん、御教授ありがとうございます、下記の様に
try〜catchを入れたら、とりあえずファイルが他のプロセスで動いている場合の(開いているとき)
例外処理は行えるようになりましたが、

引用:

それと、ストリームは finally で確実に Close されるようにするのが定石です。



finallyの処理を
finally
{
sw->Close();
}
と括ると、: error C3274: try と一致しない finallyになるのですが
こんな場合どのように処理すればよいのでしょうか?

コード:
private: System::Void toolStripButton2_Click(System::Object^  sender, System::EventArgs^  e) {
    using ::System::Windows::Forms::DialogResult;
    try{
     Stream^ myStream;
     SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog();
     saveFileDialog1->Filter = "All files (*.*)|*.*|txt files (*.txt)|*.txt|Evcel csv files (*.csv)|*.csv" ;
     saveFileDialog1->FilterIndex = 2 ;
     saveFileDialog1->RestoreDirectory = true ;

     if(saveFileDialog1->ShowDialog() == DialogResult::OK)
      {
       if((myStream = saveFileDialog1->OpenFile()) != nullptr)
       {
         {
          // カンマ区切りで保存する例
          StreamWriter^ sw = gcnew StreamWriter( myStream, Encoding::GetEncoding( L"Shift_JIS" ) ); 
          for each ( ListViewItem^ itm in listView1->Items )
           {
            sw->Write( itm->Text ); // itm->SubItems[ 0 ] でもOKでした。
            for ( int i = 1; i < itm->SubItems->Count; i++ )
             {
              sw->Write( L"," + itm->SubItems[ i ]->Text );
            }
            sw->Write( L"\n" ); //finally{	sw->Close();}と括るとエラーが発生する
          }
          sw->Close();
         }
       }
     }
    }
    catch ( Exception^ e){MessageBox::Show( "Error: ", e->ToString());}
   }

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-05-06 10:38
引用:

くまさんさんの書き込み (2006-05-06 10:13) より:

と括ると、: error C3274: try と一致しない finallyになるのですが
こんな場合どのように処理すればよいのでしょうか?


 文法を調べて、変数の有効範囲(スコープ)を考えればわかると思うのですが。。。

 あなたが理解している、try - catch - finally ブロックの文法を教えてください。

スキルアップ/キャリアアップ(JOB@IT)