Board logo

标题: [已解决] 江湖求救啊!请问,播放音乐的变量怎么制作? [打印本页]

作者: zzz19760225    时间: 2024-9-2 17:51     标题: [已解决] 江湖求救啊!请问,播放音乐的变量怎么制作?

本帖最后由 zzz19760225 于 2024-9-5 20:09 编辑

win10+vc6.0(不会整vc2013)
模仿Five66的#if#else#endif,到音乐mp3卡住了。
编译通过,但是莫得声音了!
  1. Deleting intermediate files and output files for project 'a3b5 - Win32 Debug'.
  2. --------------------Configuration: a3b5 - Win32 Debug--------------------
  3. Compiling...
  4. a3b5.cpp
  5. Linking...
  6. a3b5.exe - 0 error(s), 0 warning(s)
复制代码
开始用的
mciSendString("close 1.mp3", NULL, 0, NULL);
mciSendString("play 1.mp3", NULL, 0, NULL);
是可以关闭和播放的。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <mmsystem.h>
  9. #ifdef _MSC_VER
  10. #pragma warning(disable:4996)
  11. #endif
  12. int main (){
  13.   #ifdef UNICODE
  14.   wchar_t str[1024]={0};
  15.   #else
  16.   char str[1024]={0};
  17.   #endif
  18.     initgraph(1200, 700);
  19.     int a = 0;
  20.     while (!kbhit())
  21. {
  22.    #ifdef UNICODE
  23.    swprintf(str,111,L"哈哈%d.mp3",a);
  24.    #else
  25.    sprintf(str,"哈哈%d.mp3",a);
  26.    #endif
  27.      MOUSEMSG msg = GetMouseMsg();
  28.      if (msg.uMsg == WM_LBUTTONDOWN) {  a=a+1;  
  29.               mciSendString("close str", NULL, 0, NULL);
  30.               mciSendString("play str", NULL, 0, NULL);  }  
  31.      if (msg.uMsg == WM_RBUTTONDOWN) {  a=a-1;  
  32.               mciSendString("close str", NULL, 0, NULL);
  33.       mciSendString("play str", NULL, 0, NULL);  }
  34.    #ifdef UNICODE
  35.    swprintf(str,111,L"%d.jpg",a);
  36.    #else
  37.    sprintf(str,"%d.jpg",a);
  38.    #endif
  39.               IMAGE img;
  40.               loadimage(&img,str,1200,500);
  41.               putimage(0, 0, &img);
  42.    #ifdef UNICODE
  43.    swprintf(str,111,L"%d.txt",a);
  44.    #else
  45.    sprintf(str,"%d.txt",a);
  46.    #endif
  47.              FILE *file = fopen(str, "r");// 打开并读取文本文件
  48.              if (file) {
  49.                  char buffer[1024];
  50.                  int y = 600; // 假设图片下方开始显示文本,上下600位置写字
  51.                  char *line;
  52.                  while (fgets(buffer, sizeof(buffer), file))
  53. {// 逐行读取文件内容并显示
  54.                      line = strdup(buffer); // 复制行以便修改
  55.                      outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
  56.                      free(line);            // 释放行内存
  57.                      y += 20;               // 下一行的y坐标
  58. }
  59.             fclose(file); // 关闭文件
  60.             }
  61.     }
  62. Sleep(3300);
  63. closegraph();
  64. return 0;
  65. }
复制代码
求大侠出手。先谢了
把str和a组合起来也不行
mciSendString("play stra", NULL, 0, NULL);
作者: Five66    时间: 2024-9-4 22:54

啊,那又不会自动展开或插值
mciSendString("play stra", NULL, 0, NULL);中的play stra就只是play stra,意思是播放stra这个文件

这里想要用变量挺麻烦的,而且要是还要兼顾ansi和unicode的话,倒是c++的string貌似可以直接相加(像这样:"play "+str)

总之试试参考下面的
  1. #pragma comment(lib,"winmm.lib")
  2. #pragma comment(lib,"user32.lib")
  3. TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
  4. wsprintf(szBuffer,TEXT("%s 哈哈%d.mp3"),TEXT("close"),a);
  5. mciSendString(szBuffer, NULL, 0, NULL);
  6. wsprintf(szBuffer,TEXT("%s 哈哈%d.mp3"),TEXT("play"),a);
  7. mciSendString(szBuffer, NULL, 0, NULL);  }
复制代码

作者: zzz19760225    时间: 2024-9-5 15:14

本帖最后由 zzz19760225 于 2024-9-6 10:45 编辑

可以播放了,这就可以类似一个基本的简单电*影*了。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <windows.h>
  5. #include <graphics.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <mmsystem.h>
  9. #pragma comment(lib,"winmm.lib")
  10. #pragma comment(lib,"user32.lib")
  11. #ifdef _MSC_VER
  12. #pragma warning(disable:4996)
  13. #endif
  14. int main (){
  15.   #ifdef UNICODE
  16.   wchar_t str[1024]={0};
  17.   #else
  18.   char str[1024]={0};
  19.   #endif
  20.     TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
  21.     initgraph(1200, 700);
  22.     int a = 0;
  23.     while (!kbhit())
  24. {
  25.      MOUSEMSG msg = GetMouseMsg();
  26.      if (msg.uMsg == WM_LBUTTONDOWN) {
  27.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  28.               mciSendString(szBuffer, NULL, 0, NULL);
  29.               a=a+1;                                              }  
  30.      if (msg.uMsg == WM_RBUTTONDOWN) {
  31.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  32.               mciSendString(szBuffer, NULL, 0, NULL);
  33.               a=a-1;                                              }
  34.            wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  35.                mciSendString(szBuffer, NULL, 0, NULL);
  36.    #ifdef UNICODE
  37.    swprintf(str,111,L"%d.jpg",a);
  38.    #else
  39.    sprintf(str,"%d.jpg",a);
  40.    #endif
  41.               IMAGE img;
  42.               loadimage(&img,str,1200,500);
  43.               putimage(0, 0, &img);
  44.    #ifdef UNICODE
  45.    swprintf(str,111,L"%d.txt",a);
  46.    #else
  47.    sprintf(str,"%d.txt",a);
  48.    #endif
  49.              FILE *file = fopen(str, "r");// 打开并读取文本文件
  50.              if (file) {
  51.                  char buffer[1024];
  52.                  int y = 600; // 假设图片下方开始显示文本,上下600位置写字
  53.                  char *line;
  54.                  while (fgets(buffer, sizeof(buffer), file))
  55. {// 逐行读取文件内容并显示
  56.                      line = strdup(buffer); // 复制行以便修改
  57.                      outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
  58.                      free(line);            // 释放行内存
  59.                      y += 20;               // 下一行的y坐标
  60. }
  61.             fclose(file); // 关闭文件
  62.             }
  63.     }
  64. Sleep(3300);
  65. closegraph();
  66. return 0;
  67. }
复制代码
单独开和关都可以,但是组合起来,预备的两个音乐会点击混合在一起播放,也就是需要的单独一个播放,属于关闭的逻辑线有问题,得用另外一个变量再慢慢磨一下。
现在得去买菜去。
谢谢老师的代码
  1.      MOUSEMSG msg = GetMouseMsg();
  2.      if (msg.uMsg == WM_LBUTTONDOWN) {    a=a+1;   }  
  3.      if (msg.uMsg == WM_RBUTTONDOWN) {   a=a-1;    }
  4.                    wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  5.                    wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  6.                    mciSendString(szBuffer, NULL, 0, NULL);
复制代码
换成
  1.      MOUSEMSG msg = GetMouseMsg();
  2.      if (msg.uMsg == WM_LBUTTONDOWN) {
  3.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  4.               mciSendString(szBuffer, NULL, 0, NULL);
  5.               a=a+1;                                              }  
  6.      if (msg.uMsg == WM_RBUTTONDOWN) {
  7.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  8.               mciSendString(szBuffer, NULL, 0, NULL);
  9.               a=a-1;                                              }
  10.                    wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  11.                    mciSendString(szBuffer, NULL, 0, NULL);
复制代码
就可以关了再开的换歌曲了。问题结束,再次感谢。
(下面应该是概念里的无限数量组合,根据信息产品单元的数量来,组合出假设的无限,方便自由聚散收放.)
作者: Five66    时间: 2024-9-5 23:45

回复 3# zzz19760225


   
变量szBuffer是动态分配的,用完后free一下或许会更好点

还有,反正都用了微软msvc专属的东西了

可以将
  #ifdef UNICODE
  wchar_t str[1024]={0};
  #else
  char str[1024]={0};
  #endif

换成
TCHAR str[1024]={0};
如果不用UNICODE的话,也可以直接换成 char str[1024]={0};

同样的,可以将
   #ifdef UNICODE
   swprintf(str,111,L"%d.jpg",a);
   #else
   sprintf(str,"%d.jpg",a);
   #endif



   #ifdef UNICODE
   swprintf(str,111,L"%d.txt",a);
   #else
   sprintf(str,"%d.txt",a);
   #endif

换成
wsprintf(str,TEXT("%d.jpg"),a);

wsprintf(str,TEXT("%d.txt"),a);
不用UNICODE的话,就直接用sprintf(str,"%d.jpg",a);和sprintf(str,"%d.txt",a);
作者: zzz19760225    时间: 2024-9-6 10:44

一:
  #ifdef UNICODE
  wchar_t str[1024]={0};
  #else
  char str[1024]={0};
  #endif
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <windows.h>
  6. #include <graphics.h>
  7. #include <mmsystem.h>
  8. #pragma comment(lib,"winmm.lib")
  9. #pragma comment(lib,"user32.lib")
  10. #ifdef _MSC_VER
  11. #pragma warning(disable:4996)
  12. #endif
  13. int main (){
  14.   #ifdef UNICODE
  15.   wchar_t str[1024]={0};
  16.   #else
  17.   char str[1024]={0};
  18.   #endif
  19.     TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
  20.     initgraph(1200, 700);
  21.     int a = 0;
  22.     while (!kbhit())
  23. {
  24.      MOUSEMSG msg = GetMouseMsg();
  25.      if (msg.uMsg == WM_LBUTTONDOWN) {
  26.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  27.               mciSendString(szBuffer, NULL, 0, NULL);
  28.               a=a+1;                                              }  
  29.      if (msg.uMsg == WM_RBUTTONDOWN) {
  30.               wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  31.               mciSendString(szBuffer, NULL, 0, NULL);
  32.               a=a-1;                                              }
  33.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  34.                 mciSendString(szBuffer, NULL, 0, NULL);
  35.                
  36.    #ifdef UNICODE
  37.    swprintf(str,111,L"%d.jpg",a);
  38.    #else
  39.    sprintf(str,"%d.jpg",a);
  40.    #endif
  41.               IMAGE img;
  42.               loadimage(&img,str,1200,500);
  43.               putimage(0, 0, &img);
  44.    #ifdef UNICODE
  45.    swprintf(str,111,L"%d.txt",a);
  46.    #else
  47.    sprintf(str,"%d.txt",a);
  48.    #endif
  49.             FILE *file = fopen(str, "r");// 打开并读取文本文件
  50. if (file)
  51. {
  52.                  char buffer[1024];
  53.                  int y = 600; // 假设图片下方开始显示文本,上下600位置写字
  54. char *line;
  55.                  while (fgets(buffer, sizeof(buffer), file))
  56. {// 逐行读取文件内容并显示
  57.                      line = strdup(buffer); // 复制行以便修改
  58.                      outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
  59.                      free(line);
  60.                      y += 20;               // 下一行的y坐标
  61. }
  62.              fclose(file); // 关闭文件
  63. }
  64. }
  65.     if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
  66.     closegraph();
  67. return 0;
  68. }
复制代码
二:
TCHAR str[1024]={0};
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <windows.h>
  6. #include <graphics.h>
  7. #include <mmsystem.h>
  8. #pragma comment(lib,"winmm.lib")
  9. #pragma comment(lib,"user32.lib")
  10. #ifdef _MSC_VER
  11. #pragma warning(disable:4996)
  12. #endif
  13. int main (){
  14. TCHAR str[1024]={0};
  15.     TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
  16.     initgraph(1200, 700);
  17.     int a = 0;
  18.     while (!kbhit())
  19. {
  20.      MOUSEMSG msg = GetMouseMsg();
  21.      if (msg.uMsg == WM_LBUTTONDOWN) {
  22.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  23.             mciSendString(szBuffer, NULL, 0, NULL);
  24.             a=a+1;                                              }  
  25.      if (msg.uMsg == WM_RBUTTONDOWN) {
  26.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  27.             mciSendString(szBuffer, NULL, 0, NULL);
  28.             a=a-1;                                              }
  29.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  30.                 mciSendString(szBuffer, NULL, 0, NULL);
  31.                
  32.      wsprintf(str,TEXT("%d.jpg"),a);
  33.             IMAGE img;
  34.             loadimage(&img,str,1200,500);
  35.             putimage(0, 0, &img);
  36.      wsprintf(str,TEXT("%d.txt"),a);
  37.             FILE *file = fopen(str, "r");// 打开并读取文本文件
  38. if (file)
  39. {
  40.                  char buffer[1024];
  41.                  int y = 600; // 假设图片下方开始显示文本,上下600位置写字
  42. char *line;
  43.                  while (fgets(buffer, sizeof(buffer), file))
  44. {// 逐行读取文件内容并显示
  45.                      line = strdup(buffer); // 复制行以便修改
  46.                      outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
  47.                      free(line);
  48.                      y += 20;               // 下一行的y坐标
  49. }
  50.              fclose(file); // 关闭文件
  51. }
  52. }
  53.     if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
  54.     closegraph();
  55. return 0;
  56. }
复制代码
三:
char str[1024]={0};
  1. #include <conio.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <windows.h>
  6. #include <graphics.h>
  7. #include <mmsystem.h>
  8. #pragma comment(lib,"winmm.lib")
  9. #pragma comment(lib,"user32.lib")
  10. #ifdef _MSC_VER
  11. #pragma warning(disable:4996)
  12. #endif
  13. int main (){
  14. char str[1024]={0};
  15.     TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
  16.     initgraph(1200, 700);
  17.     int a = 0;
  18.     while (!kbhit())
  19. {
  20.      MOUSEMSG msg = GetMouseMsg();
  21.      if (msg.uMsg == WM_LBUTTONDOWN) {
  22.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  23.             mciSendString(szBuffer, NULL, 0, NULL);
  24.             a=a+1;                                              }  
  25.      if (msg.uMsg == WM_RBUTTONDOWN) {
  26.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
  27.             mciSendString(szBuffer, NULL, 0, NULL);
  28.             a=a-1;                                              }
  29.             wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
  30.                 mciSendString(szBuffer, NULL, 0, NULL);
  31.                
  32.      sprintf(str,"%d.jpg",a);
  33.             IMAGE img;
  34.             loadimage(&img,str,1200,500);
  35.             putimage(0, 0, &img);
  36.      sprintf(str,"%d.txt",a);
  37.             FILE *file = fopen(str, "r");// 打开并读取文本文件
  38. if (file)
  39. {
  40.                  char buffer[1024];
  41.                  int y = 600; // 假设图片下方开始显示文本,上下600位置写字
  42. char *line;
  43.                  while (fgets(buffer, sizeof(buffer), file))
  44. {// 逐行读取文件内容并显示
  45.                      line = strdup(buffer); // 复制行以便修改
  46.                      outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
  47.                      free(line);
  48.                      y += 20;               // 下一行的y坐标
  49. }
  50.              fclose(file); // 关闭文件
  51. }
  52. }
  53.     if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
  54.     closegraph();
  55. return 0;
  56. }
复制代码
三个都可以编译运行,大赞。
原本想把文本的星号*,看要不要也通用模式用一遍。

行 line
char *line=NULL;  
替换  char *line;
if(line != NULL) {free(line);line=NULL;}
替换  free(line);

文本 file
FILE *file =NULL;
file = fopen(str, "r");
if(file != NULL) {free(file);file=NULL;}
替换   FILE *file = fopen(str, "r");

但是不是编译就是exe执行时各种问题,放whlie外面最后清理和whlie里面都不行,就算了。
就最后结束的部分 if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
//  或者直接 free(szBuffer)  //
作者: Five66    时间: 2024-9-6 13:55

回复 5# zzz19760225


   
line那个应该没问题,问题是那个file,因为file还没有使用就free了(也不知道能不能free)
还有line是在if (file) {}之间声明的 ,是个自动变量(局部变量),因此if (file) {}之外是看不见的
同理file是第一个while的自动变量(局部变量)




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2