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


akuirejia  2007-12-07 21:25:56  No: 67154  IP: 192.*.*.*

シリアル化によるファイル処理の読み込みについて質問します。
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  No: 67155  IP: 192.*.*.*

if( ss=="" )break;

ではどう?

if( ss.IsEmpty() )break;

でもいけたかと

編集 削除
akuirejia  2007-12-08 01:11:56  No: 67156  IP: 192.*.*.*

ありがとうございます。これを元に以下のようなコードに修正しました。
今回はエラーこそでなかったものの、実行して“ファイルを開く”と、
「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  No: 67157  IP: 192.*.*.*

読み込んだファイルの中身と
Dataという変数がどう定義されているのか
わからないので、なんとも言えない

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

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

編集 削除
akuirejia  2007-12-09 18:37:42  No: 67158  IP: 192.*.*.*

変数「Data」は、
アクセス:public、種類:CString[50][3]、変数名:Dataです。

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

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

編集 削除
Blue  2007-12-09 18:43:36  No: 67159  IP: 192.*.*.*

CString変数に対して %s は使えませんよ。
GetBuffer関数を使うか、TCHAR型変数を介してCString変数に入れないといけないでしょう。

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

編集 削除
Blue  2007-12-09 18:45:40  No: 67160  IP: 192.*.*.*

訂正)

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

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

編集 削除
akuirejia  2007-12-11 06:48:02  No: 67161  IP: 192.*.*.*

ありがとうございます。
Tokenizeメソッドを使って分割、読み込むことが出来ました。

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

編集 削除
Akazaru  2007-12-12 13:34:52  No: 67162  IP: 192.*.*.*

理想は CDocument::UpdateAllViews メソッドですかね?

編集 削除