ファイル


あん  2002-10-17 14:44:31  No: 50471  IP: [192.*.*.*]

アスキーファイルを読み込むにはどうすればいいんですか?
バイナリーは読めます

編集 削除
YuO  2002-10-17 15:04:20  No: 50472  IP: [192.*.*.*]

???
アスキーファイルとは?
テキストファイルのことですか?

あと,どの様にして扱おうとしているのでしょう。

・API / システムコールレベル
このレベルでは,全てバイナリファイルとして扱うことになります。
プログラムがテキストファイルだと考えて取り扱えばテキストファイルですし,
バイナリファイルだと考えて取り扱えばバイナリファイルです。

・ライブラリレベル
a) stdio.h
fopen(filename, "r");
だとテキストファイル,
fopen(filename, "rb");
だとバイナリファイルとして扱われます。
基本的には改行コードの変換程度ですけどね。
b) iostream
std::ifstream fin(filename);
だとテキストファイル,
std::ifstream fin(filename, std::ios::binary);
だとバイナリファイルとして扱われます。

編集 削除
あん  2002-10-17 15:14:59  No: 50473  IP: [192.*.*.*]

テキストファイルです。今、こういう状態です。

// CMURADoc シリアライゼーション

void CMURADoc::Serialize(CArchive& ar)
{
  if (ar.IsStoring())
  {
    // TODO: この位置に保存用のコードを追加してください。
  }
  else
  {
    // TODO: この位置に読み込み用のコードを追加してください。
    CFile *cf;
    int i,j;  

    // ファイル名取得
    cf = ar.GetFile();
    FileName = cf->GetFileName();
    // ファイルのデータ読み出し
    for (i = 0; i < 256; i++)
    {
      for (j = 0; j < 256; j++)
      ar >> Data[i][j];

    }
    
    UpdateAllViews(NULL);
  }
}

編集 削除
Mnow  2002-10-17 15:47:55  No: 50474  IP: [192.*.*.*]

CArchive::ReadString ではだめなのでしょうか?

編集 削除
あん  2002-10-17 15:54:12  No: 50475  IP: [192.*.*.*]

どう直せばいいんですか?

編集 削除
Mnow  2002-10-17 17:08:04  No: 50476  IP: [192.*.*.*]

ar >> Data[i][j];

をこんな感じでしょうか

{
  CString strData ;
  if ( ! ar.ReadString( &strData ) ) {
    異常処理
  }
  Data[i][j] = atoi( (LPCTSTR)strData ) ;
}

編集 削除
あん  2002-10-17 20:35:02  No: 50477  IP: [192.*.*.*]

異常処理とは何ですか?

編集 削除
YuO  2002-10-17 21:30:00  No: 50478  IP: [192.*.*.*]

ちと違うみたい。
>   if ( ! ar.ReadString( &strData ) ) {
if (!ar.ReadString(strData)) {
参照で受けるので,アドレス演算子は不要です。


>   Data[i][j] = atoi( (LPCTSTR)strData ) ;
キャストしなくてもいいです。
Data[i][j] = atoi(strData);
これで,
Data[i][j] = atoi(strData.operator const char *());
というコードを生成してくれます。


> 異常処理とは何ですか?

実質的に,EOFの場合です。
ヘルプには,正常に終了しなかった場合としか書いていないですが,
ソースを見ると,ほぼEOFの場合であることがわかります。

とりあえず,自分の手持ちの物を調べてみることは重要だと思いますよ。

編集 削除
Mnow  2002-10-18 12:36:39  No: 50479  IP: [192.*.*.*]

間違ってました?  すみません。

>参照で受けるので,アドレス演算子は不要です。
あ!確かに。

>キャストしなくてもいいです。
これはわかってましたが、 CString のHELPが推奨だと
思ってて、初心者の方にはマイクロソフト推奨で書かなければ...
と考えた次第です。

> 異常処理とは何ですか?
正常に終了しなかった場合ですw
この場合でしたら TRACE出力・メッセージボックス表示後、return
がいいのでしょうか。
アプリケーションによっては Data 配列をクリアする必要も
あるかもしれません。

編集 削除
YuO  2002-10-18 15:19:25  No: 50480  IP: [192.*.*.*]

> >キャストしなくてもいいです。
> これはわかってましたが、 CString のHELPが推奨だと
> 思ってて、初心者の方にはマイクロソフト推奨で書かなければ...
> と考えた次第です。

キャストを付けるのは可変個引数だけの方が……。
というのは,
(LPTSTR)(LPCTSTR)strData
などという,馬鹿げたコードを書かないようにするためです。
キャストを書くなら,
static_cast<LPCTSTR>(strData)
のような,C++のキャスト演算子を使った方がよいですね。
static_castならばconst性を排除できないですから。

一応,明示的なキャストを行っていないMSDNの文書。
http://www.microsoft.com/japan/msdn/library/ja/vccore/html/_core_strings3a_cstring_operations_relating_to_c2dstyle_strings.asp

編集 削除