ファイルを開いて文字検索の仕方 – プログラミング – Home

ファイルを開いて文字検索の仕方
 
通知
すべてクリア

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


ナナ
 ナナ
(@ナナ)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

ファイルを開いて文字列を検索するプログラムを作りたいのですが、、どうしたらいい
のか分からないので教えて下さい!!言語は、Visual C++です。

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

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

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

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

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


引用解決済
トピックタグ
ナナ
 ナナ
(@ナナ)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

  
 ファイルを開く方法、ファイルからデータを読み込む方法で、
 何かうまくいく違う関数があるのでしたら、ぜひ教えてください!!
  
 お願いします
  


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

問題がどこにあるのかを見極めることが重要です。まずは問題の切り分けを行いましょう。

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

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


返信引用
ナナ
 ナナ
(@ナナ)
ゲスト
結合: 23年前
投稿: 12
 

 ファイルの中身のデータを読み込ませる方法を教えて下さい!!

 どうやらファイルの読み込みがうまくいっていないのが分かりました。
 
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++ では、このようにファイルを開いてデータをマッチングさせることができなにのでしょ
うか!?
本当に教えて下さい!!
  お願いします!!


返信引用
ナナ
 ナナ
(@ナナ)
ゲスト
結合: 23年前
投稿: 12
 

 ファイルの中身のデータを読み込ませる方法を教えて下さい!!

 どうやらファイルの読み込みがうまくいっていないのが分かりました。
 
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++ では、このようにファイルを開いてデータをマッチングさせることができなにのでしょ
うか!?
本当に教えて下さい!!
  お願いします!!


返信引用
トロカンパチ
 トロカンパチ
(@トロカンパチ)
ゲスト
結合: 22年前
投稿: 1
 

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


返信引用
?
 ?
(@?)
ゲスト
結合: 23年前
投稿: 49
 

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

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

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


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

トロカンパチのおっしゃる通り

>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
 RAPT
(@RAPT)
ゲスト
結合: 22年前
投稿: 310
 

こんばんは、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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました