ファイルを開いて文字検索の仕方

[戻る]
ナナ [E-Mail] 2002/11/12(火) 17:42:50
 ファイルを開いて文字列を検索するプログラムを作りたいのですが、、どうしたらいい
のか分からないので教えて下さい!!言語は、Visual C++です。

それで、具体的にどのようなことがしたいかというと、、、、、
MIDIのショートメッセージから ”3C(ド) ”というメッセージが送ります(入力された音)。

その 3C(ド)という音を、音の変換ファイル(DATA.tex)を開き、 

 
 ------------   DATA.tex -------------------------
   3D  40
   3C  3E  ←探し出したいデータの行
   :    :
   :    : 
 ----------------------------------------------------
DATA.texのファイルから送ったメッセージ同じ文字(3C)を探し出し、3E(レ)という文
字列を返し、その音を鳴らすプログラムを作りたいのです。

要するに、入力されたメッセージと同じメッセージを DATA.tex の中から探し、
同じ文字が見つかれば、その文字の隣りに書かれている文字列を返して、その音を鳴らす

その中でも、データをファイルとマッチングさせる部分がうまくいかないので、教えてほ
しいのです! データの読み込みがうまくいってないのかも、、、、。 
ファイルの開く方法は、 mmioOpen( )関数 。ファイルの中のデータ読み込む方法は
mmioGetInfo( ) 関数を使って作ったのですが、うまくいきません。
やはり、違う関数を使ったほうがいいのでしょうか!?何か
  

ナナ [E-Mail] 2002/11/12(火) 17:47:02
  
 ファイルを開く方法、ファイルからデータを読み込む方法で、
 何かうまくいく違う関数があるのでしたら、ぜひ教えてください!!
  
 お願いします
  

tib 2002/11/12(火) 18:13:56
問題がどこにあるのかを見極めることが重要です。まずは問題の切り分けを行いましょう。

「データの読み込みがうまくできていないのか」
「データは読み込めているがマッチングができていないのか」

データの読み込みができているのかどうかは、読み込んだデータをそのままダンプしてみ
ればいいですね。読み込みに問題があるのならそこを、問題がないならマッチングの方を
疑っていきます。

ナナ 2002/11/18(月) 10:21:56
 ファイルの中身のデータを読み込ませる方法を教えて下さい!!

 どうやらファイルの読み込みがうまくいっていないのが分かりました。
 
static void FileOpen(DWORD indata, HWND hWnd)
{

  FILE *fp;
  
  DWARD  data1;
    DWARD  data2;
    DWARD  data3;
    DWORD  kondata;

 //ファイルを開く
   
   if((fp=fopen("WDATA.tet", "r") == NULL){
     MessageBox(NULL, "ファイルを開けませんでした", "EORROR", MB_OK);
     }

//ファイルの中身を読み込ませる
   while(fscanf(fp, "%x %x %x %x", data1, data2, data3, kondata) !=EOF){
     if(strcmp(indata, data1) == 0)
      {
       printf(" %x " , kondata); 
      }


}


 VC++ では、このようにファイルを開いてデータをマッチングさせることができなにのでしょ
  うか!?
   本当に教えて下さい!!
  お願いします!!

ナナ 2002/11/18(月) 10:22:25
 ファイルの中身のデータを読み込ませる方法を教えて下さい!!

 どうやらファイルの読み込みがうまくいっていないのが分かりました。
 
static void FileOpen(DWORD indata, HWND hWnd)
{

  FILE *fp;
  
  DWARD  data1;
    DWARD  data2;
    DWARD  data3;
    DWORD  kondata;

 //ファイルを開く
   
   if((fp=fopen("WDATA.tet", "r") == NULL){
     MessageBox(NULL, "ファイルを開けませんでした", "EORROR", MB_OK);
     }

//ファイルの中身を読み込ませる
   while(fscanf(fp, "%x %x %x %x", data1, data2, data3, kondata) !=EOF){
     if(strcmp(indata, data1) == 0)
      {
       printf(" %x " , kondata); 
      }


}


 VC++ では、このようにファイルを開いてデータをマッチングさせることができなにのでしょ
  うか!?
   本当に教えて下さい!!
  お願いします!!

トロカンパチ 2002/11/18(月) 11:31:20
DWORD同士の比較でstrcmpを使っているのは
問題ないのでしょうか?

2002/11/18(月) 21:06:16
mmioOpenじゃなかったのですか?
読み込むファイルはテキストですか?
"%x %x %x %x"のとおり半角スペース入ってますか?
「探し出したいデータの行」とあるけど改行の処理は?
(}が足りないからもとのソースのどこかにあるのかな?)

data1の値はデバッガで確認しましたか?
printf(" %x " , kondata); が実行されないからといって
うまくいってないと判断していませんか?

>データの読み込みができているのかどうかは、読み込んだデータをそのままダンプしてみ
>ればいいですね。読み込みに問題があるのならそこを、問題がないならマッチングの方を
>疑っていきます。
よけいなif分なしにして素直に全部(data1, data2, data3, kondata)printfしましょ。

アイススケーター 2002/11/19(火) 08:02:17
トロカンパチのおっしゃる通り

>DWORD同士の比較でstrcmpを使っているのは
>問題ないのでしょうか?

比較しようとしているものがぜんぜんちがうため話になりませんね。


>   while(fscanf(fp, "%x %x %x %x", data1, data2, data3, kondata) !=EOF){

これは、data1からdata4はポインタ渡しにする必要があるでしょう。
scanfのヘルプを読んでね。

正常に読み込んだとして

>     if(strcmp(indata, data1) == 0)

両方ともDWORD同士なので

      if(indata == data1)

でOKです。

あと、ファイルフォーマットが解ればもう少しサポートできると思います。

RAPT 2002/11/21(木) 02:19:49
こんばんは、RAPTです。

static void FileOpen(const DWORD& indata, HWND hWnd)
{
    FILE *fp = NULL;

    DWORD data1 = 0;
    DWORD data2 = 0;
    DWORD data3 = 0;
    DWORD kondata = 0;

    // ファイルを開く
    fp = fopen("WDATA.tet", "r"); // あえて分けて書いてみました
    if (fp == NULL) {
        MessageBox(hWnd, "ファイルを開けませんでした", "ERROR", MB_OK);
        return; // return としないと、以下もこのまま実行される
    }

    // ファイルの中身を読み込ませる
    for (;;) {
        int result = fscanf(fp, "%x %x %x %x", &data1, &data2, 
&data3, &kondata);
        if (result == EOF)
            break;

        printf("入力された項目の数は %d\n", result);
        printf("内容は: %x %x %x %x\n", data1, data2, data3, kondata);

        if (indata == data1) {
            printf(" %x " , kondata); 
        }
    }
}

途中、セミコロンや中括弧がなかったり、スペルミスらしきところは適当に直してあります。
# 変数宣言時に初期化してあるのは単なる私の個人的志向です。

fscanf のところは、デバッグ用に書いてみました。
ファイル仕様がよく分からないので、まぁ、適当に。

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

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