- 締切済み
VBAとC言語でwavファイル再生
VBAとCのプログラムについてどなたかアドバイスしていただけませんか? 特定のcsvファイルに1が入ったら指定のwavファイルを再生させるプログラムを作りたいのですが、 どうしてもエラーになってしまいます。 (必ずどこかのcsvに1が入り、その他のcsvには0が入るようにしています。) 以下にVBAとCのプログラムを載せます。 ちなみに、VBAはopen1と同様の内容をopen10まで行い、read1も同様にread10まで行います。 Sub open1() Dim buf As String Open "C:\Users\Documents\Debug\file1.csv" For Input As #1 Do Until EOF(1) Line Input #1, buf Cells(1, 1) = buf Open "C:\Users\Documents\Visual Studio 2008\Projects\PlaySound\Debug\1.csv" For Output As #2 Print #2, buf Close #2 Loop Close #1 End Sub Sub read1() Dim FlNum As Long, FlName As String, Atai As Variant FlNum = FreeFile FlName = "C:\Users\\Documents\Debug\file1.csv" Open FlName For Output Access Write As #FlNum Atai = Range("A1") Print #FlNum, CStr(Atai) Close #FlNum End Sub これでcsvの内容をコピーさせています。 そして、Cのプログラムが以下です。 #include "stdafx.h" #include <windows.h> #include <mmsystem.h> #include<stdio.h> #include<time.h> #include<windows.h> #pragma comment (lib,"winmm.lib") FILE *fp1; FILE *fp2; FILE *fp3; FILE *fp4; FILE *fp5; FILE *fp6; FILE *fp7; FILE *fp8; FILE *fp9; FILE *fp10; int _tmain(int argc, _TCHAR* argv[]) { //引数 int s; int t; int u; int v; int w; int x; int y; int z; int z1; int z2; //回数表現 int a=1; int b=1; int c=1; int d=1; int e=1; int f=1; int g=1; int h=1; int h1 = 1; int h2 = 1; while(1){ Sleep(2000); fp1 = fopen("1.csv","r"); fp2 = fopen("2.csv","r"); fp3 = fopen("3.csv","r"); fp4 = fopen("4.csv","r"); fp5 = fopen("5.csv","r"); fp6 = fopen("6.csv","r"); fp7 = fopen("7.csv","r"); fp8 = fopen("8.csv","r"); fp9 = fopen("9.csv","r"); fp10= fopen("10.csv","r"); printf("finish to open csv file\n"); fscanf(fp1,"%d",&s); printf("finish to scan file1.csv %d\n", &s); fscanf(fp2,"%d",&t); fscanf(fp3,"%d",&u); fscanf(fp4,"%d",&v); fscanf(fp5,"%d",&w); fscanf(fp6,"%d",&x); fscanf(fp7,"%d",&y); fscanf(fp8,"%d",&z); fscanf(fp9,"%d",&z1); fscanf(fp10,"%d",&z2); printf("finish to scan csv file\n"); if(s==1&&a==1){ ::PlaySound(_T("what.wav"),NULL, SND_FILENAME); b = 1; c = 1; d = 1; e = 1; f = 1; g = 1; h = 1; h1 = 1; h2 = 1; a++; } (同様にif文がcsvのそれぞれにつきあるのと、fcloseもありますが、省略します。) ビルドは正常終了するのですが、デバッグすると以下のエラーメッセージが出ます。 Debug Assertion Failed! Proogram:...\Debug\PlaySound.exe File:f:\dd\vctools\crt_bld\self_x86\crt\src\fscanf.c Line:52 Expression:(stream != NULL) For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts. (Press Retry to debug the application) 中止(A)再試行(R)無視(I) 試しにDebugフォルダにできた実行ファイルを開くと printfできちんと出力もできてますし、 csvファイルもきちんと出力できています。 wavファイルを再生させるにはどうしたらいいでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
本題に対する知識は持ち合わせていませんが, 最低限「コンパイルできるプログラム」を出してください.... PlaySound の引数を確認するつもりはないけど, ::PlaySound(_T(filename2[]),NULL, SND_FILENAME); の第1引数は明らかにおかしい.
- hitomura
- ベストアンサー率48% (325/664)
Cのほうのプログラム、何で配列を使わないんでしょうか? ……と、横道にそれた突っ込みはさておいて。 まずfopenの戻り値を確認しましょう。何らかの理由でファイルを開けなかった場合、fopenはNULLを返します。そのばあいそのファイルハンドルは利用できません。 というか、ファイルをいっぺんに10個開ける必要があるかよく考えましょう。 1個開けて値を読み取り閉じた後に次のファイルを開けて……ということを繰り返せば一度に開けているファイルは1つですむはずです。 また、おんなじことを繰り返すのならばループを使って楽をしましょう。多分行数が1/10位になると思います。冒頭の突っ込みもこっちの方では横道どころか修正のメインとなる部分です。 まあ、あなたが1行いくらで仕事を貰っているならこのままのコード納品を止めませんが、査収の際に文句が出ることを覚悟してください。
補足
ご回答ありがとうございます。 現在、学生でまだまだ未熟なので、勉強不足で申し訳ありません。 指摘された通り修正してみたのですが、 PlaySound関数のwavファイルの指定がうまくできませんでした。 質問時にあげたプログラムで戻り値の確認をしたところNULLを返していました。 しかし、Debugにできた実行ファイルを開くとNULLは返されていないみたいです…。 なぜデバッグはうまくいかないのに実行ファイルは開けるのかいろいろと参照したのですが わからず困っています。 修正したプログラムを以下に載せるのでこちらもご指摘いただけると幸いです。 #include "stdafx.h" #include <windows.h> #include <mmsystem.h> #include<stdio.h> #include<time.h> #include<windows.h> #pragma comment (lib,"winmm.lib") int _tmain(int argc, _TCHAR* argv[]){ char filename1[] = "001.csv"; char filename2[] = "001.wav"; FILE *fp[10]; int n[10], c[10]; int i; while(1){ Sleep(2000); c[10] = 1; for(i=1; i<=10; i++){ fp[i] = fopen(filename1[i], "r"); if(fp[i] == NULL){ printf("File Open Error\n"); } fscanf(fp[i],"%d", &n); if(n[i]==1 && c[i]==1){ ::PlaySound(_T(filename2[]),NULL, SND_FILENAME); c[i] = 2; filename1[i] += 1; if(filename1[i] > '9'){ filename1[i] = '0'; filename1[i] += 1; } filename2[i] += 1; if(filename2[i] > '9'){ filename2[i] = '0'; filename2[i] += 1; } fclose(fp[i]); } } }