読み込みできません

[戻る]
レイ 2003/11/14(金) 13:32:28
/////////////////////////////////////////////////////////////////////////////
// CVcgrphView クラスの描画

void CVcgrphView::OnDraw(CDC* pDC)
{
    CVcgrphDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: この場所にネイティブ データ用の描画コードを追加します。

    int a;
    char c[30];    

         AfxMessageBox("read");
    CFile fp("1.txt",CFile::modeRead);
    CArchive ar(&fp,CArchive::load);
    ar>>a;
    ar.Close();
         sprintf(c,"%d",a);
         pDC->TextOut(200,200,c);
}
aの出力が出ません。
ファイルの読み方が間違っていますか?
間違っている場合どのように訂正すると動作しますかご教授ください。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 13:52:12
書き込みが間違ってはいませんか?
どうやって書き込みました?
ちゃんと CArchive ar に対し "ar << なにか;" しましたか?

PATIO 2003/11/14(金) 13:53:26
もっと具体的に表示されている内容を説明しましょう。
これではどう出力されているのかさっぱり分かりません。

ところでOnDrawの中でMessageBoxだすと
OnDrawが繰り返し実行されて終われなくなりませんか?
デバッガで実行していれば止められるとは思いますけれど。
TRACEを使ったほうがいいと思いますけれど。

あと、ファイルはちゃんと開けているんですかねぇ?
開けていないファイルから読込はできないでしょう。

レイ 2003/11/14(金) 14:06:42
//    AfxMessageBox("read");
//    CFile fp("1.txt",CFile::modeRead);
//    CArchive ar(&fp,CArchive::load);
//    ar>>a;
//    ar.Close();
//    sprintf(c,"%d",a);
の代わりに
a=10;
とする場合、出力は画面に10と表示されるプログラムです。
1.txtに10と保存されています。
その10をプログラムに直接書くのではなくファイル入力をします。
書き込みが間違っていないか?との質問の意味が理解できません。
詳しく教えてください。

レイ 2003/11/14(金) 14:07:30
書き忘れていました。
// AfxMessageBox("read");
しました。

dairygoods 2003/11/14(金) 14:17:39
(1) "1.txt"というファイルは存在しますか?
(2) 存在するならどのフォルダに存在しますか?EXEファイルとの位置関係は?
(3) "1.txt"ファイルの中身はどうなっていますか?
   メモ帳で開くとどうなりますか?
   バイナリエディタで開くとどうなりますか?

DOSKOI-PANDA 2003/11/14(金) 14:32:24
void CTestDlg::OnBtnWriteFileTest() 
{
    CFile        oFile("data.txt", 
CFile::modeWrite|CFile::modeCreate);
    CArchive    oArc(&oFile, CArchive::store);
    int            a = 10;

    oArc << a;
    oArc.Close();
}

と書いて実行してみると、data.txt の中身は、

0A 00 00 00 (EOF)

んなってました。

CArchive ってあんまし使ったことないですが、
入力出力が対応しているとすると、

上記のやり方で書いたものでないと、

int a;
oArc >> a;

というやり方では読めないのでは(実験中途半端)

(CArchive 調べてみると、LPCTSTRと CString 用の '<<' '>>' が
定義されてなかった。なんか事情があるんでしょう)

DOSKOI-PANDA 2003/11/14(金) 14:37:33
>1.txtに10と保存されています。

というのが、エディタやメモ帳などで調べたとしたら、
それは "10" という文字列で入ってんだから、

CString strA;

ar.ReadString(strA);
int a = StrToInt(strA);

かな?(試してないですが)

レイ 2003/11/14(金) 14:38:20
作成したフォルダの中にプログラムと1.txtがあります。
実行した結果のEXEファイルは作成したフォルダの中のDebugの中に存在します。
テキストをメモ帳で開けると
10
と表示されます。
BZ(http://www.vector.co.jp/soft/dl/win95/util/se032859.html)のバイナリエディ
タで開くと
        +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F  0123456789ABCDEF
000000  31 30 0D 0A                                      10..
と表示されます。

レイ 2003/11/14(金) 14:42:20
後々数多くの数字として読み込み処理をしたいので、文字という読み込み方法や一文字
だけ読み込む方法では目的が達成しません^^。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 14:45:44
テキストとして出力されたファイルから読み込むのであれば、
あなたのその読み込み方は間違っています。

ふつーに 

  std::ifstream strem("1.txt");
  int a;
  stream >> a;

すればいいのとちゃいますか?

レイ 2003/11/14(金) 15:01:40
一番上のプログラムのコメント(14:06:42、14:07:30)したもの結果はになります。
10になるはずなのですが168636465と出ます。

std::ifstream strem("1.txt");
  int a;
  stream >> a;
のプログラム結果は
C:\ .cpp(80) : error C2653: 'std' : 識別子がクラス名でも名前空間名でもありませ
ん。
C:\ .cpp(80) : error C2065: 'ifstream' : 定義されていない識別子です。
C:\ .cpp(80) : error C2146: 構文エラー : ';' が、識別子 'stream' の前に必要です。
C:\ .cpp(80) : error C2065: 'stream' : 定義されていない識別子です。
C:\ .cpp(82) : warning C4552: '>>' : 演算子にプログラム上の作用がありません。
作用を持つ演算子を使用してください
となりエラーになりました。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:03:06
#include <fstream> してないでしょ?

レイ 2003/11/14(金) 15:15:55
エラー減りました。
一番上のstdエラーが残りました。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:21:09
"include <ftream> しました? オシリに .h を付けてはいけません。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:21:46
っく、typoです。 正しくは #include <fstream>

レイ 2003/11/14(金) 15:25:27
.hつけました。
.hが無い場合は
c:\program files\microsoft visual studio\vc98\include\new(35) : error C2061: 構
文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。
c:\program files\microsoft visual studio\vc98\include\new(35) : error C2091: 関
数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\new(35) : error 
C2809: 'operator new' に仮引数リストがありません。
c:\program files\microsoft visual studio\vc98\include\new(36) : error C2061: 構
文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。
c:\program files\microsoft visual studio\vc98\include\new(37) : error C2091: 関
数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\new(37) : error 
C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,const struct 
std::nothrow_t &)' : オーバーロード関数の戻り値は異なっていますが、引数リストは同一で
す。
c:\program files\microsoft visual studio\vc98\include\new(41) : error C2061: 構
文エラー : 識別子 'THIS_FILE' がシンタックスエラーを起こしました。
c:\program files\microsoft visual studio\vc98\include\new(42) : error C2091: 関
数は関数を返せません。
c:\program files\microsoft visual studio\vc98\include\new(42) : error 
C2556: 'void *(__cdecl *__cdecl operator new(void))(unsigned int,void *)' : オー
バーロード関数の戻り値は異なっていますが、引数リストは同一です。
c:\program files\microsoft visual studio\vc98\include\new(42) : error 
C2809: 'operator new' に仮引数リストがありません。
c:\program files\microsoft visual studio\vc98\include\new(42) : error 
C2065: '_P' : 定義されていない識別子です。

とエラーになりました。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:28:07
やれやれ…

#ifdef _DEBUG ... より'前'で #include しましたか?

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:30:01
どーしてもダメなら #include <stdio.h> して fopen/fscanf/fclose 使いましょう。

レイ 2003/11/14(金) 15:32:09
後でした。
プログラムのエラーはおかげさまでなくなりましたが、結果の表示は
-858993460と間違った答えが出ました。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:43:47
ファイルのオープンに失敗していませんか?

レイ 2003/11/14(金) 15:51:12
ファイルのオープンが失敗している事をどのように確認すればいいですか?

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 15:59:37
  std::ifstream strem("1.txt");
  ASSERT(stream.is_open()); // コレを追加してdebug-mode実行
  int a;
  stream >> a;

レイ 2003/11/14(金) 16:14:39
[[解決]]
助かりました。

επιστημη [E-Mail] [HomePage] 2003/11/14(金) 16:15:48
ちょいまち。ちゃんと報告してください。不具合の原因と対処を。

PATIO 2003/11/14(金) 18:59:23
だから、上から二番目の書き込みで

ファイルのオープンに失敗してませんか?

と書いていたんですけれど、確認してなかったんですね。
本当なら一番最初にするべきだと思うのですけれど。

デバッガーで動かしていたのであれば、Debugの中にファイルがあっても読めません。
カレントディレクトリがDebugではないから。

古いスレッドには追加発言できません。