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


akuirejia  2007-12-08 06:25:56  No: 67154

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

if( ss=="" )break;

ではどう?

if( ss.IsEmpty() )break;

でもいけたかと


akuirejia  2007-12-08 10:11:56  No: 67156

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

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

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

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


akuirejia  2007-12-10 03:37:42  No: 67158

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

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

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


Blue  2007-12-10 03:43:36  No: 67159

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

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


Blue  2007-12-10 03:45:40  No: 67160

訂正)

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

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


akuirejia  2007-12-11 15:48:02  No: 67161

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

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


Akazaru  2007-12-12 22:34:52  No: 67162

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加