自己動手寫類似酷狗播放器(5)_檔案的儲存和讀取

YunShell發表於2013-08-11
    對於播放器,我們希望在開啟的時候,播放列表存有上一次的歌曲,不必每次去新增,就是通過檔案的操作實現的。
這裡要實現兩個:
	1.在播放器開啟的時候,能自動載入上一次的歌曲資訊進入Listbox,並且更新歌曲資訊庫
        2.關閉的時候,能儲存關閉前的播放列表和歌曲總數

1.c語言中檔案的操作

    在C語言的標準庫函式中,有直接對檔案操作的,對檔案的操作
先總結下:輸入輸出流的問題
   在控制檯程式中,我們的輸出put和輸入get。都是對於列印終端而言的。比如putchar(ch)向螢幕終端輸出一個字元ch。getchar從螢幕終端獲得一個字元。所以Put有關的就是 輸出到哪裡,可以是終端,可以是檔案,和get關的就是從哪裡get。可以從終端,可以從檔案。
操作檔案步驟:
1.開啟檔案
FILE fp;
if(fp=FileOpen("路徑",”rb“)==NULL)
    MessageBox(hwnd,TEXT(”檔案開啟失敗“),"error",MB_OK);
2.訪問檔案
	 fputc(ch,fp),    ch=fgetc(fp) 
         fprintf(fp,”%d”,ch);將ch字元已十進位制的形式存入f指向的檔案
         fscanf(fp,“%d”,&i)從檔案中取得一個字元 並格式為整形存入變數i中
         fwrite(buffer,size,count,fp) 向檔案寫入一塊資料結構體資料…
         fread(buffer,size,count,fp)  從結構體或者塊資料得到資料

3.關閉檔案
fclose(檔案指標) 
fclose(fp) 成功返回0,否則返回EOF(-1)
4.檔案狀態	
feof(fp):是否到檔案最後一行 ,是的話返回為真
while(!feof(fp))來判斷是否訪問檔案結束

2.播放器中的應用

    在播放器中,我們要做的就是在開啟播放器時,在初始化函式中,自動將一次存到硬碟的歌曲檔案資訊插入到Listbox播放列表中,並且更新歌曲庫,在退出播放器的時候,要把當前播放列表中的歌曲載入到硬碟檔案,重新更新下該存檔文字。這裡因為是對大塊資料的操作,故用 fwrite(),fread()兩個函式來操作。
下面程式碼演示如何初始化時候載入:
BOOL LoadFileInfo(HWND hwnd,FileInfo *fileinfo)  //向全域性變數載入歌曲資訊
{
	FILE *fp;
	if((fp=fopen("C:\\musicplay_songinfo.ini","rb"))==NULL)
	{	MessageBox(hwnd,TEXT("開啟上一次儲存歌曲列表錯誤"),TEXT("error"),MB_OK);
		return FALSE;
	}
	fscanf(fp,"%d",&isong); //得到歌曲總數
	for(INT i=0;i<isong;i++) //檔案沒有到最後一行
	{	if(fread(&fileinfo[i],sizeof(FileInfo),1,fp)!=1)
		{
			MessageBox(hwnd,TEXT("寫入檔案錯誤"),"",MB_OK);
			return FALSE;
		}
		TCHAR withnum_pure[100];
		OutWithNumSongName(i,fileinfo[i].songname,withnum_pure);
		ListBox_InsertString(hlistbox,-1,withnum_pure);
	}
	fclose(fp);  //記住要關閉檔案
	return TRUE;
}
下面程式碼演示如何儲存歌曲檔案
BOOL SaveFileInfo(HWND hwnd,FileInfo *fileinfo) //儲存檔案到 C:\\上 
{
	FILE *fp;
	if((fp=fopen("C:\\musicplay_songinfo.ini","wb"))==NULL)
	{	MessageBox(hwnd,TEXT("開啟檔案錯誤"),"",MB_OK);
		return FALSE;
	}
	fprintf(fp,"%d",isong); //將isong格式化到fp指向的檔案中
	for(INT i=0;i<isong;i++)
	{	if(fwrite(&fileinfo[i],sizeof(FileInfo),1,fp)!=1)
		{
			MessageBox(hwnd,TEXT("寫入檔案錯誤"),"",MB_OK);
			return FALSE;
		}
	}
	fclose(fp);  //記住要關閉檔案
	return TRUE;
}

相關文章