■ シリアル化によるファイル処理で、空白の場合に読み込みを終了とするには?

[Visual C++ Q & A 掲示板] [過去ログの一覧]


akuirejia 2007/12/07(金) 21:25:56 <初心者>
シリアル化によるファイル処理の読み込みについて質問します。
csvファイルの読み込みについて以下のようにしたのですが、「データが終了の時、読み込みを終了する」とするために“NULL”を使ったのですが「error C2593: 'operator ==' があいまいです。」とエラ−が出ました。
この場合どうすればよいのでしょうか?よろしくお願いします。

void CFileDoc::Serialize(CArchive& ar){
 CString ss;
 if (ar.IsStoring()){
 }else{
  for(int i=0;;i++){
   ar >> ss;
   if(ss==NULL) break;
   sscanf_s(ss,"%s,%s,%s",&Data[i][0],&Data[i][1],&Data[i][2]);
  }
 }
}

rin 2007/12/07(金) 22:56:01
if( ss=="" )break;

ではどう?

if( ss.IsEmpty() )break;

でもいけたかと

akuirejia 2007/12/08(土) 01:11:56 <初心者>
ありがとうございます。これを元に以下のようなコードに修正しました。
今回はエラーこそでなかったものの、実行して“ファイルを開く”と、
「File.exe の 0x1023beef (msvcr80d.dll) でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x003ae000 に書き込み中にアクセス違反が発生しました。」というメッセージがでてきました。
いろいろいじってみたところ、「sscanf_s()」あたりがおかしいように、どうなのでしょうか?またどう修正すればいいのでしょうか?

void CFileDoc::Serialize(CArchive& ar){
 CString ss;
 if (ar.IsStoring()){
 }else{
  for(int i=0;;i++){
   ar.ReadString(ss);
   if(ss.IsEmpty() )break;
   sscanf_s(ss,"%s,%s,%s",&Data[0][0],&Data[0][1],&Data[0][2]);
  }
 }
}

rin 2007/12/09(日) 03:39:04
読み込んだファイルの中身と
Dataという変数がどう定義されているのか
わからないので、なんとも言えない

デバッグモードで動かしてるなら
おかしなことが発生したところで止まってくれる
#発生箇所が原因とは限らないが

とりあえず、ssの中身が、ReadStringにて
予定されたものがきちんと入ってるかどうか
ウォッチなどを使って確認してみてはどうでしょう

akuirejia 2007/12/09(日) 18:37:42 <初心者>
変数「Data」は、
アクセス:public、種類:CString[50][3]、変数名:Dataです。

読み込むファイルはテキストファイルで、
中身は、
Aは,Bに,Cする
Bは,Dに,Eする  です。

MFCのシングルドキュメントを使っていて、それ以外は変更していません。

Blue 2007/12/09(日) 18:43:36
CString変数に対して %s は使えませんよ。
GetBuffer関数を使うか、TCHAR型変数を介してCString変数に入れないといけないでしょう。

カンマが2つと決まっているのであれば、Tokenizeメソッドを使って分割してみては?
(もしくはFindメソッド→Midメソッドで分割)

Blue 2007/12/09(日) 18:45:40
訂正)

>GetBuffer関数を使うか
GetBufferメソッドを使うか

ちなみに
>アクセス:public、種類:CString[50][3]、変数名:Dataです。
列数が固定で行数が決まっていないのであれば(構造体をメンバとする)CArrayとかvectorを使ったほうが便利でしょう。

akuirejia 2007/12/11(火) 06:48:02 <初心者>
ありがとうございます。
Tokenizeメソッドを使って分割、読み込むことが出来ました。

で、まだ質問があるのですが、シリアル化機能を使ってファイルを読み込んだ直後に、自動的にビュークラス内のメンバ関数にアクセスするにはどうすればよいのでしょうか?

Akazaru 2007/12/12(水) 13:34:52 <中級者>
理想は CDocument::UpdateAllViews メソッドですかね?

毎週金曜日はポイント最大3倍!さらに4倍のチャンスも!

Programming Library