前几天我发表了一些有关于音频文件的文章,但都是用来做解码的,很少涉及到信息提取问题!通过这个例子,我是想说明如何在文件系统内确定文件指针的指向问题。 在利用LabWindows/CVI制作C语言程序时,原则上可以读取任何文件的内容。但是,用C语言读取其它文件信息时,如果遇到“\0”或者在内存中遇到“00 00”之类的字符时,会默认为结束标识符而停止继续读取,这个时候,需要调整文件的指针,使其能读取其它的数据文件。 我们知道,一般的“*.exe”文件是以“MZ”开头的,其后一般是结束符,然后是其它的一些内容,用CVI读取时,只能读前两个字符! 所以,如果想读取其它的信息,需要考虑一下,并适当使用一些技巧了! 现在所读取的MP3文件包含以下内容: 用UltraEdit将一个MP3文件打开,其最后的128位为MP3的信息位,如下图所示。 程序的界面如下:
代码如下: #include #include #include #include #include "mp3info.h" static int panelHandle; int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { if (InitCVIRTE (hInstance, 0, 0) == 0) return -1; /* out of memory */ if ((panelHandle = LoadPanel (0, "mp3info.uir", PANEL)) < 0) return -1; DisplayPanel (panelHandle); RunUserInterface (); DiscardPanel (panelHandle); return 0; } //打开按钮 int CVICALLBACK OkCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { int status; char path[MAX_PATHNAME_LEN]; long filesize = 0; int filehandle; char *buffer; switch (event) { case EVENT_COMMIT: status = FileSelectPopup ("", "*.mp3", "*.mp3", "打开MP3文件", VAL_LOAD_BUTTON, 0, 1, 1, 1, path); if (status > 0) { //打开文件 filehandle = OpenFile (path, VAL_READ_ONLY, VAL_OPEN_AS_IS, VAL_BINARY); //获得文件的大小 GetFileInfo (path, &filesize); //动态分配内存,以存储MP3信息 buffer = malloc (128 * sizeof(char)+1); //初始化内存 buffer[0] = '\0'; //获得标题信息 TAG从倒数128位开始,内容从倒数125开始 //定位文件指针 SetFilePtr (filehandle, filesize-125, 0); //读取文件 ReadFile (filehandle, buffer, 31); //文件最后加上结束符 buffer[30] = '\0'; InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "标题:"); InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer); //获得艺术家信息 buffer[0] = '\0'; status = SetFilePtr (filehandle, filesize-95, 0); ReadFile (filehandle, buffer, 32); buffer[31] = '\0'; InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "艺术家:"); InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer); //获得专辑信息 buffer[0] = '\0'; status = SetFilePtr (filehandle, filesize-65, 0); ReadFile (filehandle, buffer, 31); buffer[30] = '\0'; InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "专辑:"); InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, buffer); //内容分隔符 InsertTextBoxLine (panelHandle, PANEL_TEXTBOX, -1, "------------------------------------"); //释放内存 free(buffer); //关闭文件 CloseFile (filehandle); } break; } return 0; } //退出按钮 int CVICALLBACK QuitCallback (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { switch (event) { case EVENT_COMMIT: QuitUserInterface (0); break; } return 0; }
转自:小信的博客 网址:http://blog.sina.com.cn/u/1265070197 |