【摘要】 介紹C語(yǔ)言文件編程,創(chuàng)建BMP圖片,BMP圖片結(jié)構(gòu)介紹,介紹目錄接口編程,Makefile知識(shí)點(diǎn)。
任務(wù)1: 文件操作函數(shù)學(xué)習(xí)
??學(xué)習(xí)兩套函數(shù):
(1)?C語(yǔ)言下標(biāo)準(zhǔn)文件操作函數(shù)。fopen、fclose、fread、fwrite (適合操作普通文件)
針對(duì)文件指針操作。
(2)?Linux下專用的文件操作函數(shù)。open、close、read、write (適合操作設(shè)備文件、也可以操作普通文件)
針對(duì)文件描述符操作。
??如何檢測(cè)文件是否讀取到結(jié)尾? 判斷讀函數(shù)的返回值。
??文件操作相關(guān)的練習(xí)作業(yè)
1.?(編碼)創(chuàng)建一張BMP圖片,顏色可以指定。
2.?模擬du命令,可以查看指定文件的大小,可以將文件大小打印出來(lái)。
3.?文件加密和解密。 密碼: 數(shù)字方式、字符串方式
(1)?加密方式: 異或加密
擴(kuò)展: 加密方式: MD5加密
擴(kuò)展作業(yè): 實(shí)現(xiàn)文件的壓縮和解壓,模擬tar命令。
創(chuàng)建BMP圖片:
#include
#include
/* 必須在結(jié)構(gòu)體定義之前使用,這是為了讓結(jié)構(gòu)體中各成員按1字節(jié)對(duì)齊 */
#pragma pack(1)
/*需要文件信息頭:14個(gè)字節(jié) */
struct tagBITMAP_FILE_HEADER
{
unsigned short bfType; //保存圖片類似。 'BM' -- 0x4d42
unsigned int bfSize; //圖片的大小
unsigned short bfReserved1;
unsigned short bfReserved2;
unsigned int bfOffBits; //RGB數(shù)據(jù)偏移地址
};
/* 位圖參數(shù)信息 */
struct tagBITMAP_INFO_HEADER {
unsigned long biSize; //結(jié)構(gòu)體大小
unsigned long biWidth; //寬度
unsigned long biHeight; //高度
unsigned short biPlanes;
unsigned short biBitCount; //顏色位數(shù)
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
};
/*
函數(shù)功能: 創(chuàng)建一張BMP圖片
函數(shù)參數(shù):
char *name 文件名稱
int w 寬度
int h 高度
int c 顏色位數(shù)
函數(shù)返回值: 0表示成功
*/
int CreateBmpImage(char *name,int w,int h,int c)
{
/*1. 創(chuàng)建文件*/
FILE *file=fopen(name,"wb");
if(file==NULL)return 1;
/*2. 創(chuàng)建BMP文件頭*/
struct tagBITMAP_FILE_HEADER head;
memset(&head,0,sizeof(struct tagBITMAP_FILE_HEADER));
head.bfType=0x4d42; //BMP圖片的類型
head.bfSize=sizeof(struct tagBITMAP_FILE_HEADER)+sizeof(struct tagBITMAP_INFO_HEADER)+w*h*3;
head.bfOffBits=sizeof(struct tagBITMAP_FILE_HEADER)+sizeof(struct tagBITMAP_INFO_HEADER);
if(fwrite(&head,1,sizeof(struct tagBITMAP_FILE_HEADER),file)!=sizeof(struct tagBITMAP_FILE_HEADER))
{
return 2;
}
/*3. 創(chuàng)建BMP圖像參數(shù)信息*/
struct tagBITMAP_INFO_HEADER info;
memset(&info,0,sizeof(struct tagBITMAP_INFO_HEADER));
info.biSize=sizeof(struct tagBITMAP_INFO_HEADER);
info.biWidth=w;
info.biHeight=h;
info.biBitCount=24;
info.biPlanes=1;
if(fwrite(&info,1,sizeof(struct tagBITMAP_INFO_HEADER),file)!=sizeof(struct tagBITMAP_INFO_HEADER))
{
return 3;
}
/*4. 圖片顏色數(shù)據(jù)填充*/
int i,j;
for(i=0;i;i++)>
BMP圖片練習(xí)文件操作(專題練習(xí)):
1.?BMP圖片數(shù)據(jù)取模,模擬圖片取模軟件。(選擇16位或者24位取模方式)
2.?BMP圖片放大縮小,根據(jù)輸入的尺寸放大縮小圖片。
3.?實(shí)現(xiàn)圖片4種翻轉(zhuǎn)效果: 上、下、左、右。
文件系統(tǒng):
1.?文件系統(tǒng)本身就是一套上層(軟件層)算法,底層有與硬件交互的接口。
硬件: 磁盤(pán)、U盤(pán)、SD卡 (扇區(qū))…….
2.?文件本身屬于一個(gè)容器,沒(méi)有規(guī)定存放什么類型的數(shù)據(jù)。
3.?文件指針(光標(biāo)位置),會(huì)隨著讀寫(xiě)函數(shù)移動(dòng)。
4.?文件讀寫(xiě)權(quán)限: 打開(kāi)文件需要選擇正確的權(quán)限。
??文件格式介紹:
圖片: BMP、PNG、JPG/JPEG、GIF、ICO
文本: txt(字符串)
文檔: doc
??Main函數(shù)傳遞參數(shù)
#include int main(int argc,char **argv) { //argc :表示參數(shù)的數(shù)量 //argv :二維指針,指向傳入的每一個(gè)字符串首地址 int i; for(i=0;i;i++)<> { printf("argv[%d]=%s\n",i,argv[i]); } return 0; } |
目錄過(guò)濾:
#include
#include
#include
#include
#include
// ./app <.mp3>
/*
函數(shù)功能: 輸出指定目錄下指定指定后綴的文件名稱+路徑
./app /bmp/jpg/ .mp3
*/
int PrintDirName(char *DirName,char *str)
{
/*1. 打開(kāi)目錄*/
DIR *dirp=opendir(DirName);
if(dirp==NULL)return 1;
/*2. 循環(huán)讀取目錄*/
struct dirent *file_p=NULL;
char *findstr=NULL;
char *addr_p=NULL; //存放最終完整的文件名稱
while(file_p=readdir(dirp))
{
char *findstr=strstr(file_p->d_name,str);
if(findstr)//123.mp3 123.mp3.mp4 123.mp3.txt
{
//比較后綴
if(strcmp(findstr,str)==0)
{
addr_p=malloc(strlen(DirName)+strlen(file_p->d_name)+1);
strcpy(addr_p,DirName); //拼接目錄
strcat(addr_p,file_p->d_name);//拼接文件名稱
printf("文件完整路徑=%s\n",addr_p);
free(addr_p); //釋放空間
}
}
}
/*3. 關(guān)閉目錄*/
closedir(dirp);
return 0;
}
int main(int argc,char **argv)
{
if(argc!=3)
{
printf("./app <.mp3>\n");
return 0;
}
PrintDirName(argv[1],argv[2]);
return 0;
}
任務(wù)2: 目錄相關(guān)操作函數(shù)
創(chuàng)建目錄、打開(kāi)目錄、讀取目錄。
??需求: 獲取指定目錄下指定后綴的所有文件,并且輸出每個(gè)文件的路徑信息。
作業(yè): 拷貝目錄下所有文件(指定后綴的文件)到指定目錄下,考慮一層目錄。
擴(kuò)展: 遞歸拷貝,考慮多層目錄。
任務(wù)3: Makefile文件
作業(yè):
1.?使用Makefile建立工程,只需要寫(xiě)一個(gè)Makefile文件。
2.?使用Makefile建立工程,每個(gè)目錄下就寫(xiě)一個(gè)Makefile文件。
app:print.o main.o sum.o
gcc main.o print.o sum.o -o app
print.o:print.c
gcc print.c -c
main.o:main.c
gcc main.c -c
sum.o:sum.c
gcc sum.c -c
clean:
rm app *.o -f
;i++)> -
Linux
+關(guān)注
關(guān)注
87文章
11227瀏覽量
208920 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7598瀏覽量
136184 -
BMP
+關(guān)注
關(guān)注
0文章
48瀏覽量
17043
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論