ファイル

[戻る]
あしゅ 2003/02/06(木) 20:26:47
int i, j;
CFile* fp = ar.GetFile();
FileName = fp->GetFileName();
if(FileName,"*.M","I.*")
{
    if( fp->GetLength() < HEADER_SIZE ) {
    return;
    }
    fp->Seek( HEADER_SIZE, CFile::begin );
    unsigned short *y;
       y = p;
    for ( i=0; i<IMAGEDATA_SIZE; i++, y++) 
      {
    fp->Read(y, sizeof( unsigned short ));
    }
}
else if(FileName,"t.*")
    {            
    ifstream mystream;
    if(FileName,"a.*")
    {
    for( i = 0; i < NX; i++ ){
    for( j = 0; j <NY; j++ ){
    mystream >> Data[j][i];}}
    }    
}
これはSerialize(CArchive& ar)で行っています。
なぜか上のは読めるのですが下が読めません
ファイル名をelse ifの方を選択しても上の方が選ばれてしまいます。
選択の使い方が間違っているんでしょうか?
上がバイナリ−で下がアスキーファイルです
教えてください

PAI 2003/02/06(木) 20:44:06
過去ログ読んで自分の質問の仕方に不備がないか良く考えましょう。

『読めない』という表現ではどう『読めない』のかがわかりません。

PAI 2003/02/06(木) 20:49:31
参考スレッドです。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010080.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010081.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010083.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010085.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010091.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010123.txt
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200302/03020029.txt

トスポ 2003/02/06(木) 20:54:44
単にifの使い方を間違ってるだけでは?

あしゅ 2003/02/06(木) 20:57:52
すいません、どう間違っているのか教えてください;;

YuO [E-Mail] 2003/02/06(木) 21:31:04
> すいません、どう間違っているのか教えてください;;

> if(FileName,"*.M","I.*")
は,
if("I.*" != 0)
つまりは
if(true)
と同じなので,else節には一切処理が行きません。
if (FileName == "*.M" || FileName == "I.*")
としたいのかな?

if文についての勉強をちゃんとしてください。C/C++言語の基礎知識なので。

NEG(ねぐ) [E-Mail] [HomePage] 2003/02/06(木) 21:38:06
 if文はこっちでも、、、
http://www.microsoft.com/JAPAN/developer/library/default.asp?
URL=/japan/developer/library/vclang/_clang_the_c_if_statement.htm
 それとこれか???
http://www.microsoft.com/JAPAN/developer/library/default.asp?
URL=/japan/developer/library/vclang/_clang_sequential.2d.evaluation_operator.ht
m

あしゅ 2003/02/06(木) 21:47:31
もし、ファイルが**MとI.**だったら上のファイル読み込み、
もし、t**というファイルなら下の読み込みに行くようにしたいです

(ゥ? 2003/02/06(木) 22:15:14
else if(FileName,"t.*")
{            
    ifstream mystream;
    if(FileName,"a.*")
    {
         // if分の書き方も間違っているが・・・
         // ここにくることはありえないでしょう
         // if(FileName =="t.*" && FileName =="a.*") 絶対に無理!
    }    
}

マップ 2003/02/06(木) 22:18:09
>もし、ファイルが**MとI.**だったら上のファイル読み込み、
>もし、t**というファイルなら下の読み込みに行くようにしたいです

if(ファイルが**MとI.**だったら)
    上のファイル読み込み
else if(t**というファイルなら)
    下の読み込み

ファイル名の判定は
・最後の文字が'M'で最後から一個前が'.'なら上の読み込み
・一文字目が’I’で,二文字目が’.’なら上の読み込み
そうじゃなくて
・一文字目が’t’なら下の読み込み

こんなかんじになるのではないでしょうか?

あしゅ 2003/02/06(木) 22:56:07
if文が違うというのはどこがどう違うのか教えてもらえないですか?

マップ 2003/02/06(木) 23:05:33
>if文が違うというのはどこがどう違うのか教えてもらえないですか?

>if(FileName,"*.M","I.*")
これは,if文の書式としては間違ってませんが
あしゅさんのやりたいことを実現する手段としては間違っています.

>if(FileName,"*.M","I.*")
はYuOさんもおっしゃってるように
if("I.*" != 0)
という風に,C言語では解釈されます.

あなたの頭の中では
>if(FileName,"*.M","I.*")
かけば,
>もし、ファイルが**MとI.**だったら上のファイル読み込み、
となるかもしれませんが,
C言語ではそのように解釈されません.

マップ 2003/02/06(木) 23:07:21
で,

ファイル名の判定は
・最後の文字が'M'で最後から一個前が'.'なら上の読み込み
・一文字目が’I’で,二文字目が’.’なら上の読み込み
そうじゃなくて
・一文字目が’t’なら下の読み込み

こんなかんじでどうでしょう?

あしゅ 2003/02/06(木) 23:13:15
>>こんなかんじでどうでしょう?

ごめんなさい、少しわかりにくいのでもう少し説明お願いします

マップ 2003/02/06(木) 23:25:06
>ごめんなさい、少しわかりにくいのでもう少し説明お願いします

>if(FileName,"*.M","I.*")
この文が,

>もし、ファイルが*.MとI.*だったら
ということをあらわしているとして,*がワイルドカードだとすると,
このif文は,
「最後(ヌルを除いて)が'M'で,最後から一文字目が'.'のファイル名か,
最初が'I'で,二文字目が'.'のファイル名の場合」
この条件にあてはまるファイル名なら上のファイルを読み込んでください.

で,
>if(FileName,"t.*")
は,上と同じ仮定の基では
「最初が't'で,次が'.'のファイル名なら」
という解釈になるので,このようなファイル名なら
下の読み込みにいってください

wood 2003/02/06(木) 23:26:49
>if文が違うというのはどこがどう違うのか

については
キチンと回答者の方々のご意見見てますか?

>YuO [E-Mail] 2003/02/06(木) 21:31:04
>(ゥ? 2003/02/06(木) 22:15:14
に回答されている通りです

これをご理解いただけないのであれば
NEG(ねぐ) さんがお示しくださった場所での
内容をしっかり自分の物として学習し身につけてから
再度お越しくださいませ。

επιστημη 2003/02/06(木) 23:29:35
...一体世の中ではなにが起こってるんだろ。
こんなんばっかや。

マップ 2003/02/06(木) 23:32:27
>...一体世の中ではなにが起こってるんだろ。
>こんなんばっかや。

世の中こんなんばっかなんですか...

私は,’このスレ’or'これに大変よく似たスレッド'
だけだと思いたいです...

暇人貴子 2003/02/06(木) 23:32:38
新しい課題でも出たのかな?

あしゅ 2003/02/06(木) 23:39:05
マップさん、それならあってるのではないのですか?
何が違うのかが理解できません

マップ 2003/02/06(木) 23:42:32
>何が違うのかが理解できません

ということは,あなたは

>if(FileName,"*.M","I.*")>もし、ファイルが**MとI.**だったら
を,意味すると思っているわけですね?

あしゅ 2003/02/06(木) 23:53:56
そういう解釈なのですが違うのですか?
ごめんなさい・・何かいい例を書いてもらえないでしょうか?
勉強はしてるのですが、なかなか理解できず悩んでいます
本当に申し訳ございません

暇人貴子 2003/02/07(金) 00:07:36
>そういう解釈なのですが違うのですか?
失礼ながら、この程度のCの知識で
MFCを使うのは無謀と思われます。

PAI 2003/02/07(金) 00:10:50
やれやれだ、自分の質問の仕方については考えてはくれないのですか?
あなたが何をしようとしていて、何がわからないのかが、あなたの発言からではわからないので
すが?

if 文は括弧内の式を評価して、『それが0以外か、0か』のみを判断します。
if 文自体にワイルドカード展開などという高水準な機能はありません。
自分が判定したいものを分解し、一つ一つ書いていく必要があります。
日本語で言うテニオハのような知識です。理解してください。

あなたは
    if( a, 1 )
と書けば、『aが1ならば』と解釈されると思っているかもしれませんが、それはまったくの誤り
です。

『aが1ならば』なら、『aと1を比較し、その結果が真ならば』つまり
    if ( a == 1 )
と書く必要があります。

入門書を読むなり。参考書を読むなり。正しく教えてくれない講師を問い詰めるなりして
正しく理解してください。

で、あなたが何を判定指定のしたいのかがよくわからないのですが、
とりあえず、『.』の前後の文字で処理を振り分けたいのだ、と、こちらで勝手に解釈します。

    // 後ろから '.' を探す
    int dot = Filename.ReverseFind('.');
    
    // 見つからない、一番最後、一番最初の時はどうしようもないからかえる。
    
    if( dot == 0 || dot == -1 || dot >= Filename.GetLength()) return;

    // '.' の前と後の文字を取り出す。同時に比較を容易にするために大文字に変換。
    int nextOfDot = _toupper( Filename.GetAt( dot+1 ));
    int prevOfDot = _toupper( Filename.GetAt( dot-1 ));

    // 前が M もしくは後が I なら
    if(nextOfDot == 'M' || prevOfDot == 'I' ){
        // ReadBinary
    }
    // そうではなく、前が T なら
    else if(prevOfDot == 'T')
    {
        // ReadText
    }

επιστημη 2003/02/07(金) 00:14:28
>ごめんなさい・・何かいい例を書いてもらえないでしょうか?

>もし、ファイルが**MとI.**だったら上のファイル読み込み、
>もし、t**というファイルなら下の読み込みに行くようにしたいです

もし x が 1 か 2 だったら XXX を、3 だったら YYY を行いたい

  if ( x == 1 || x == 2 ) {
    XXX;
  } else if ( x == 3 ) {
    YYY;
  } else {
    それ以外
  }

PAI 2003/02/07(金) 00:14:58
失礼

テニオハ     → テニヲハ
判定指定のしたい → 判定したい

joan 2003/02/07(金) 00:17:55
例

if( (FileName == "*.M") || ( FileName  == "I.*"))

みたいな感じ。間違っていても判定式使って書いてくれた方が
まだわかりやすいです。"*" ってワイルドカードですよね?

あしゅ 2003/02/07(金) 01:14:46
int i, j;
CFile* fp = ar.GetFile();
FileName = fp->GetFileName();
if(FileName == "*.M" ||  FileName  == "I.*")

{
    if( fp->GetLength() < HEADER_SIZE ) {
    return;
    }
    fp->Seek( HEADER_SIZE, CFile::begin );
    unsigned short *y;
       y = p;
    for ( i=0; i<IMAGEDATA_SIZE; i++, y++) 
      {
    fp->Read(y, sizeof( unsigned short ));
    }
}
else if(FileName== "t.*")
    {            
    ifstream mystream;
    if(FileName=="a.*")
    {
    for( i = 0; i < NX; i++ ){
    for( j = 0; j <NY; j++ ){
    mystream >> Data[j][i];}}
    }    
}
これでよろしいのでしょうか?

επιστημη 2003/02/07(金) 01:32:41
だめです。PAIさんのリプライを読んでないでしょ。

RAPT 2003/02/07(金) 01:45:03
> (FileName == "*.M" ||  FileName  == "I.*")
質問1.ここで言っている'*'は、DOSで言う、ワイルドカードなのでしょうか?
    # '*' means for 0 or 1+ charactors.
質問2.FileName の型は何なんでしょう?

(A) '*'をワイルドカードとして扱いたい場合、かつFileName の型がCString型
である場合は、マッチすることはほとんどないでしょう。

(B) '*'をマッチし得る文字として、かつFileName の型がCString型である場合
は、マッチし得るでしょう。

'*'をワイルドカードとして扱いたい場合、かつ
> (FileName == "*.M" ||  FileName  == "I.*")
と書きたいならば、FileNameの型をCString型から派生するなどして、
==演算子をオーバーライドし、ワイルドカード比較可能なクラスを
自作する必要があります。
# ちなみに、σ(^^)はこのような機能を実装した自作クラスを使用しています。

Windows98/VC++6.0sp5pro/SDK-may2002/ATL3.0/WTL7.0

RAPT 2003/02/07(金) 01:47:53
追記
> (B) '*'をマッチし得る文字として、かつFileName の型がCString型である場合
> は、マッチし得るでしょう。
ただし、DOS/Windows環境なら、マッチする可能性は皆無です。
∵DOS/Windowsでは、ファイル名として、'*', '?'はワイルドカードのため、使用不可

トスポ 2003/02/07(金) 01:49:24
他のスレを含めて今までのこのようなパターンから思うのは、質問者がリプライを
理解出来ないが、具体的に何が理解出来ないかをリプライ中の文章から引用して示
すこともできないから、余計に泥沼にはまるのではないかと。
どこまで理解出来たのか、どこが分からないのか、永遠に分からない。誰にも。

taki 2003/02/07(金) 02:00:31
ファイル名は
バイナリー 003.MRとかとI.005など
アスキー  teaaa.a009みたいな感じです.a,b,cあります

あしゅ 2003/02/07(金) 02:01:33
間違えて、違う名前コピーしてしまいました・・

RAPT 2003/02/07(金) 02:35:54
ってことは、ここで言っている'*'は、DOSで言う、ワイルドカードなんですね。
FileName の型は、CString型ですか?

あしゅ 2003/02/07(金) 02:37:17
はい、FileName の型は、CString型です

トスポ 2003/02/07(金) 02:50:29
何故ワイルドカードなのかどうかをはっきり答えないのか?
言葉の意味が分からないなら、そう答えるべき。

RAPT 2003/02/07(金) 03:38:21
「ワイルドカード」の意味が分からないなら、調べましょう。
Googleで検索してみるとか。

http://yougo.ascii24.com/gh/04/000432.html

適切な例とはいえないが、
http://www5b.biglobe.ne.jp/~onajimi/dos_tisiki02.html


(参考)
ワイルドカードを使って文字列を比較する−C/C++−水無瀬の部屋
http://www.hidecnet.ne.jp/~sinzan/tips/c/c_tip03.htm

n [E-Mail] 2003/02/07(金) 08:59:20
お〜い、PAIさんがガッチリ答えを書いてるんだぞ〜。

PAI 2003/02/07(金) 09:44:32
自分が理解できないものは理解しようともしない。
だから理解できる範囲が広がるはずもない。だから成長しない。
だから同じものが繰り返される。

επιστημη 2003/02/07(金) 09:52:41
ってゆーか、どうすればこうも噛み合わない受け答えができるんだろうかと。
なんか'からかわれてんじゃないか?'と勘ぐりたくなるくらいに噛み合いませんなぁ...

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