文章目录

    • c语言实现代码
    • 运行结果
  • 总结:

输入: wavinfo -i xxx.wav -o output.txt

输出:(格式规范)xxx=yyy

rate(Hz)=16000
length=32000
ch=2
depth(bit)=16

c语言实现代码

命令行输入参数,读取wav文件的信息
#include <stdio.h>
#include <stdint.h> /*struct类型里面我用的是uint32_t等类型,而不是传统的int,short等等这些类型是由stdint.h头文件提供*/
#include <stdlib.h>
#include <windows.h>typedef struct wave_tag //声明结构体的相关参数 {char ChunkID[4]; // "RIFF"标志unsigned int ChunkSize; // 文件长度(WAVE文件的大小, 不含前8个字节)char Format[4]; // "WAVE"标志char SubChunk1ID[4]; // "fmt "标志unsigned long int SubChunk1Size; // 过渡字节(不定)unsigned short int AudioFormat; // 格式类别(10H为PCM格式的声音数据)unsigned short int NumChannels; // 通道数(单声道为1, 双声道为2)unsigned short int SampleRate; // 采样率(每秒样本数), 表示每个通道的播放速度unsigned int ByteRate; // 波形音频数据传输速率, 其值为:通道数*每秒数据位数*每样本的数据位数/8unsigned short int BlockAlign; // 每个样点的Byte数(按字节算), 其值为:通道数*每样本的数据位数/8unsigned short int BitsPerSample; // 每个样点的数据位数, 表示每个声道中各个样本的数据位数.char SubChunk2ID[4]; // 数据标记"data"unsigned long int SubChunk2Size; // 语音数据的长度} WAVE;void main(int argc, char *argv[]){if (argc != 5)   //命令行输入参数判断 {printf("输入参数有误");return 0;}FILE *fp;                      //定义指针型文件 FILE *fpWrite;                //定义指针型文件 WAVE wav;                     //调用结构体wav char a[20];//输入参数条件设定        if ((**(argv + 1)) == '-'){switch (*(*(argv + 1) + 1))//等效于*(argv[1] + 1){case 'i':fp=fopen(argv[2],"rb"); /*以二进制方式打开并读取(rb)wav文件,通常r是正常方式读取文件 */ fread(&wav, sizeof(WAVE), 1, fp);     //读取文件信息 break;default:printf("无此命令,请重新运行\n");break;}}//输出参数条件设定 if ((**(argv + 3)) == '-'){switch (*(*(argv + 3) + 1))//等效于*(argv[1] + 1){case 'o':fpWrite=fopen(argv[4],"wb");if((fp = fopen(argv[4],"wb")) == NULL)//查看文件是否创建成功 {printf("\nerror on open argv[4]!");getch();exit(1);}/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ChunkID=\t%c%c%c%c \n",wav.ChunkID[0],wav.ChunkID[1],wav.ChunkID[2],wav.ChunkID[3]);printf("%s",a);fprintf(fpWrite,"%s",a);     //将"RIFF"标志信息写到输出文件中 //            fprintf(fpWrite,"%s","\n"); //在文件中写入一个换行符 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ChunkSize=\t%d\n",wav.ChunkSize);          printf("%s",a);           fprintf(fpWrite,"%s",a);   //将WAVE文件长度信息写到输出文件中 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"Format=\t\t%c%c%c%c\n",wav.Format[0],wav.Format[1],wav.Format[2],wav.Format[3]);           printf("%s",a);           fprintf(fpWrite,"%s",a);   //将"WAVE"标志信息写到输出文件中 /*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1ID=\t%c%c%c%c\n",wav.SubChunk1ID[0],wav.SubChunk1ID[1],wav.SubChunk1ID[2],wav.SubChunk1ID[3]);          printf("%s",a);           fprintf(fpWrite,"%s",a);   //将"fmt"标志信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size);         printf("%s",a);           fprintf(fpWrite,"%s",a);   //将过渡字节信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size);          printf("%s",a);           fprintf(fpWrite,"%s",a);   //将过渡字节信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"AudioFormat=\t%x\n",wav.AudioFormat);           printf("%s",a);           fprintf(fpWrite,"%s",a);   //将格式类别(10H为PCM格式的声音数据)信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"NumChannels=\t%d\n",wav.NumChannels);           printf("%s",a);           fprintf(fpWrite,"%s",a);   //将通道数写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SampleRate=\t%d\n",wav.SampleRate);            printf("%s",a);           fprintf(fpWrite,"%s",a);   //将采样率写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"ByteRate=\t%d\n",wav.ByteRate);            printf("%s",a);           fprintf(fpWrite,"%s",a);   //将波形音频数据传输速率写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"BlockAlign=\t%d\n",wav.BlockAlign);         printf("%s",a);           fprintf(fpWrite,"%s",a);   //将个样点的Byte数信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"BitsPerSample=\t%d\n",wav.BitsPerSample);          printf("%s",a);           fprintf(fpWrite,"%s",a);   //将每个样点的数据位数信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk2ID=\t%c%c%c%c                                      \n",wav.SubChunk2ID[0],wav.SubChunk2ID[1],wav.SubChunk2ID[2],wav.SubChunk2ID[3]);          printf("%s",a);           fprintf(fpWrite,"%s",a);   //将"data"标志信息写到输出文件中/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/sprintf(a,"SubChunk2Size=\t%ld\n",wav.SubChunk2Size);            printf("%s",a);           fprintf(fpWrite,"%s",a);   //将数据长度信息写到输出文件中break;default:printf("无此命令,请重新运行\n");break;}}return 0;fclose(fpWrite);
}

运行结果

在命令行输入(wavinfo.c需提前编译生成wavinfo.exe)

wavinfo -i E:\\test_wave\\2.wav -o output.txt

命令行显示情况

在文件中产生output.txt文件,并写入wave文件信息

总结:

1.在读wav文件信息时,要注意“r”与“rb”的区别

2.在输入wav文件路径时,要注意wav文件的路径需要用绝对路径,且以\\隔开

3.sprintf(字符串格式转换)的用法

//sprintf的实例
#include <stdio.h>
void main()
{char s[10] ;int a=10;sprintf(s,"a=%d",a);printf("%s",s);return 0;
}

运行结果


4.命令行传参实例

c代码

//命令行参数的用法
#include <stdio.h>
void main(int argc,char** argv)
{printf("%d\n",argc);printf("%s\n",argv[0]);printf("%s\n",argv[1]);printf("%s\n",argv[2]);
}

在命令行输入

test_transfer_parameters hello word

命令行运行结果

以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中相关推荐

  1. linux中的head 显示文件头部内容、tail 输出文件尾部内容

    1.2.14 head 显示文件头部内容 head 用于显示文件的开头部分内容,默认情况下 head 指令显示文件的前 10 行内容 head 文件 (功能描述:查看文件头10行内容) head -n ...

  2. Nginx —— nginx的命令行控制(nginx的启动与停止、重载配置文件、回滚日志文件、平滑升级等操作)

    在linux中,需要使用命令来控制Nginx服务器的启动与停止.重载配置文件.回滚日志文件.平滑升级等行为. 默认情况下,nginx被安装在目录/usr/local/nginx中,其二进制文件路径为/ ...

  3. Hive-CDH参数修改指南--增加自定义参数--命令行显示当前数据-查询结果显示表头(类似修改源生Hive的hive-site.xml文件)

    Hive-CDH参数修改指南(类似修改源生Hive的hive-site.xml文件) 问题描述 默认配置下,每次启动Hive都要手动输入配置选项,才能实现:在命令行显示当前数据库(set hive.c ...

  4. 如何通过命令行查找一个IP的地理位置信息

    转载地址:http://www.geekfan.net/7863/ 如果你想查找一个IP地址在地球上的实际地理位置,现在已经有好多在线的GeoIp查找服务你可以利用(例如geoiptool.com). ...

  5. matlab实现基于24位真彩色BMP图像的文件信息隐藏方法(实验内容)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一.24位真彩色BMP图像 1.简介 2.文件格式 二.算法(四种) 三.matlab实现 1.图像文件尾部添加信息 2.位 ...

  6. chm文件在服务器看不到内容,电脑不能打开文件secedit.chm怎么办_网站服务器运行维护,电脑...

    win10系统搜索不到无线网络怎么办_网站服务器运行维护 win10系统搜索不到无线网络的解决方法:1.首先按[win+r]组合键打开运行窗口,输入service.msc,点击[确定]:2.然后开启[ ...

  7. C++ 如何将一个文件夹中的所有文件(.txt或者.log)内容整合到一个文件(.txt或者.log)当中

    有时候我们希望读取一个文件夹中的所有文件,对各个文件中的数据按某种规则进行筛选,然后将筛选后的数据整合到一个文件中.这段时间正好替同事写了这一部分,在此记录下来自己的处理过程,如果有需要的朋友也可以参 ...

  8. makefile obj文件路径_Makefile一问:如何修改.o输出文件的输出路径 Linux/Unix社区 / 程序开......

    我在Linux下编成时,用Makefile文件生成的.o文件老是跟我的源文件在同一个目录下,搞得我用TAB键之余还得先再敲.c再TAB,为什么要多敲两次键盘?如果我把所有生成的.o文件放比如./obj ...

  9. python输出文本内容_python如何输出文件内容

    文件只是连续的字节序列.数据的传输经常会用到字节流,无论字节流是由单个字节还是大块数据组成. 你必须先用Python内置的open()函数打开一个文件,创建一个file对象,相关的方法才可以调用它进行 ...

最新文章

  1. 1.Socket通信
  2. coordinatorlayout 设置不可滑动_滑动关闭App损害iPhone电池寿命,我们需要“改掉强迫症”吗?...
  3. Set Up Optimization
  4. 分享十佳Web开发资源
  5. ORACLE 11G EXP导出空表方法
  6. SQL Server:统计数据库中每张表的大小
  7. Python Django项目部署 Linux 服务器
  8. 计算机上配置的网卡实际上是,()计算机上配置的网卡,实质上是_ ___。
  9. poj 3373 Changing Digits
  10. Excel导出xml
  11. RunningCheese Firefox 71.0 正式版 [1225]
  12. CDISC SDTM CE domain学习笔记
  13. 用友U8打开起初采购入库单报错
  14. python股票收益率协方差_[Python]如何利用TuShare计算各股票间的相关性和协方差
  15. 应用标题及描述不可滥用关键字
  16. iphone计算机照片大小,如何把iphone照片导入电脑 四种方法分享【图文】
  17. 【Lintcode】1880. Largest Number X Which Occurs X Times
  18. 网络编程:网络协议简介
  19. SEO优化,外链重要还是友情链接重要?
  20. 常用ACM知识点清单(未完待续)

热门文章

  1. OpenSSL SSL_connect: Connection was reset in connection to github.com:443
  2. 【luogu1816】忠(RMQ问题、线段树)
  3. php为什么要创建类,php – 是否有理由为单一功能创建类?
  4. 计算机应用基础2016高起专,2016年秋季《计算机应用基础(高起专)》期末考核
  5. tcga数据下载_手把手教你用R下载TCGA数据:CGDSR包
  6. 网络虚拟化有几种实现方式_机械零件表面实现镜面的几种加工方式
  7. 第四章 ASP.NET MVC HTML.ActionLink输出超链接的具体用法
  8. 如何从stackoverflow的api 中获取是数据_如何修复Vue中的 “this is undefined” 问题
  9. Qt UDP组播的应用
  10. 2018北京ICPC B. Heshen's Account Book(模拟)