《C程序设计C程序设计 (96).pdf》由会员分享,可在线阅读,更多相关《C程序设计C程序设计 (96).pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C程序设计程序设计Programming in CProgramming in C编程处理各种格式的文件编程处理各种格式的文件1、从文件中读写二进制数据2、成千上万的文件格式C C程序设计程序设计程序设计程序设计3 310.3.5 10.3.5 读写数据块读写数据块fread函数从文件中读入指定数目指定记录大小的数据块,其函数原型为:size_tsize_t freadfread(voidvoid*bufferbuffer,size_tsize_t sizesize,size_tsize_t countcount,FILEFILE*streamstream););4 410.3.5 10.
2、3.5 读写数据块读写数据块参数stream是已打开的文件指针,该文件必须是以读或读写方式打开的。buffer是数组或能容纳成批数据的内存区起始地址(如动态分配得到的内存区),用于存储读取到的数据。参数size表示所读记录的大小,如读字节数据时,记录为字节,大小为1;又比如读结构体数据时,记录为结构体,大小为结构体长度。参数count表示欲读取多少个记录,如为单个记录,则count为1,如为一批记录(数组),则count为记录数或数组长度。因此,使用fread函数读到的总字节数等于。5 510.3.5 10.3.5 读写数据块读写数据块例如:intint m m,*,*p p;unsigned
3、 charunsigned char arrayarray 100100;structstruct tagDATA atagDATA a,B B 1010;freadfread(&(&m m,sizeofsizeof(intint),),1 1,fpfp););/读1个整型,参数buffer是整型变量的地址/读100个字节,参数buffer是数组名(地址)/读1个整型,参数buffer是整型变量的地址/读100个字节,参数buffer是数组名(地址)freadfread(arrayarray,sizeofsizeof(unsigned charunsigned char),),100100,f
4、pfp););/读结构体,参数buffer是结构体对象的地址/读结构体,参数buffer是结构体对象的地址freadfread(&(&a a,sizeofsizeof(structstruct tagDATAtagDATA),),1 1,fpfp););/读结构体数组,参数buffer是数组名(地址)/读结构体数组,参数buffer是数组名(地址)freadfread(B B,sizeofsizeof(structstruct tagDATAtagDATA),),1010,fpfp););p p=(=(intint*)*)mallocmalloc(100100*sizeofsizeof(int
5、int););/动态分配能容纳100个整型的内存区/动态分配能容纳100个整型的内存区freadfread(p p,sizeofsizeof(intint),),100100,fpfp););/读100个整型,参数buffer是指针值(地址)/读100个整型,参数buffer是指针值(地址)6 610.3.5 10.3.5 读写数据块读写数据块size_t类型本质上是unsigned int型,函数返回实际读入的记录总数。由于读入错误或实际数据量的原因,返回值总是小于等于count。如果buffer参数实际内存长度不足以存储读入数据时,fread函数会导致崩溃性错误。7 710.3.5 10.
6、3.5 读写数据块读写数据块fwrite函数将指定数目指定记录大小的数据块写入文件中,其函数原型为:fwrite函数参数含义与fread相同,fwrite函数输出时不会进行任何编码转换、插入数据等操作,即直接将内存数据送到文件中。size_tsize_t fwritefwrite(const voidconst void*bufferbuffer,size_tsize_t sizesize,size_tsize_t countcount,FILEFILE*streamstream););8 810.3.5 10.3.5 读写数据块读写数据块使用fread和fwrite函数处理成批数据、数组、结
7、构体等记录形式数据的二进制文件最方便,被广泛地应用于图形图像、音频视频、科学计算、格式文档文件应用中。在处理成批数据二进制文件时,比fgetc和fputc函数有效率。但fread和fwrite函数不适合处理文本文件,因为它将空字符(0)、换行符(n)、回车符(r)都一视同仁,读写数据不容易分辨出字符串信息。9 910.3.5 10.3.5 读写数据块读写数据块【例10.6】使用加大缓冲方式复制源文件为目的文件,支持命令行文件名输入。101010.3.5 10.3.5 读写数据块读写数据块例10.61#include#include 2#include#include 3 intint main
8、main(intint argcargc,charchar*argvargv)4 /使用带参数的main函数版本获取命令行信息/使用带参数的main函数版本获取命令行信息5 charchar srcsrc 260260,destdest 260260,buffbuff 1638416384;/读写缓冲达到16K/读写缓冲达到16K6 FILEFILE*inin,*,*outout;7 unsigned intunsigned int rsrs;8 ifif(argcargc 2 2)getsgets(srcsrc););/若无命令行参数输入源文件名/若无命令行参数输入源文件名9 elseels
9、e strcpystrcpy(srcsrc,argvargv 1 1););/否则第1个命令行参数为源文件名/否则第1个命令行参数为源文件名10 ifif(argcargc 3 3)getsgets(destdest););/若只有1个命令行参数输入目的文件名/若只有1个命令行参数输入目的文件名11 elseelse strcpystrcpy(destdest,argvargv 2 2););/否则第2个命令行参数为目的文件名/否则第2个命令行参数为目的文件名12 inin=fopenfopen(srcsrc,rb);,rb);/打开源文件读/打开源文件读13 ifif(inin!=!=NUL
10、LNULL)14 outout=fopenfopen(destdest,wb);,wb);/创建目的文件写/创建目的文件写15 whilewhile(!(!feoffeof(inin)/是否到源文件末尾/是否到源文件末尾111110.3.5 10.3.5 读写数据块读写数据块例10.616 rsrs=freadfread(buffbuff,sizeofsizeof(charchar),),sizeofsizeof(buffbuff),),inin););17 fwritefwrite(buffbuff,sizeofsizeof(charchar),),rsrs,outout););/按实际读到
11、字节数写入/按实际读到字节数写入18 19 fclosefclose(outout););/关闭目的文件/关闭目的文件20 fclosefclose(inin););/关闭源文件/关闭源文件21 22 returnreturn 0 0;23 121210.5 10.5 编程处理各种格式的文件编程处理各种格式的文件1这世上,有成千上万种文件格式 压缩文件:7z,APK,ARC,ARJ,bzip2,cab,deb,DMG,GHO,gzip,jar,RAR,tar,Z,zip 图像设计文件:3dxml,ASM,DWF,DWG,GBR,AI,CDR,PSD,PDF,BMP,DIB,GIF,ICO,JP
12、EG,MNG,PCX,EPS,SVG,3DS,C4D 文档文件:DOC,DOCX,HTML,ABF,FNT,OTF,TTF,WOFF,XLS,XLSX,PPT,PPTX.131310.5 10.5 编程处理各种格式的文件编程处理各种格式的文件141410.5 10.5 编程处理各种格式的文件编程处理各种格式的文件2了解文件格式的网站 维基百科(支持中文):https:/en.wikipedia.org/wiki/List_of_file_formats https:/en.wikipedia.org/wiki/List_of_filename_extensions_(alphabetical)
13、Extension.info:http:/www.extension.info/File extension database:http:/ 10.5 编程处理各种格式的文件编程处理各种格式的文件2了解文件格式的网站 FileDesc(支持中文):http:/ FileExtension.info:http:/fileextension.info/F(支持中文):http:/ FileI:http:/ File Extension:http:/www.file- Formats:http:/ Wotsit.org:http:/devel.archefire.org/mirrors/www.wo
14、tsit.org/161610.5 10.5 编程处理各种格式的文件编程处理各种格式的文件3这伙计,开源了一个检测文件格式的程序 http:/putec.ch/projekte/filerecon/171710.5 10.5 编程处理各种格式的文件编程处理各种格式的文件4找到文件格式的说明,才能处理它ZIP文件MIDI文件RIFF文件181810.5 10.5 编程处理各种格式的文件编程处理各种格式的文件【例10.5】显示24位位图文件信息。191910.5 10.5 编程处理各种格式的文件编程处理各种格式的文件例题分析24位位图文件由文件头、位图信息头和图形数据三部分组成。文件头主要包含文件
15、大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图像尺寸信息、图像像素字节数、是否压缩、图像所用颜色数等信息(http:/devel.archefire.org/mirrors/www.wotsit.org/网站上有各种图形图像、音频视频、文档文件格式的说明)。根据位图文件格式定义文件头、位图信息头结构体类型,从位图文件读取结构体数据从而得到位图文件信息。202010.5 10.5 编程处理各种格式的文件编程处理各种格式的文件5BMP位图文件格式 https:/en.wikipedia.org/wiki/BMP_file_format212110.3.5 10.3.5 读写数据块
16、读写数据块例10.51#include#include 2#pragma pack(1)#pragma pack(1)/结构体按1个字节对齐/结构体按1个字节对齐3 typedef structtypedef struct tagBITMAPFILEHEADERtagBITMAPFILEHEADER /文件头/文件头4 unsigned shortunsigned short bfTypebfType;/文件类型,固定为BM/文件类型,固定为BM5 unsigned intunsigned intbfSizebfSize;/文件大小(字节)/文件大小(字节)6 unsigned shortun
17、signed short bfReserved1bfReserved1;/保留/保留7 unsigned shortunsigned short bfReserved2bfReserved2;/保留/保留8 unsigned intunsigned intbfOffBitsbfOffBits;/位图数据到文件头的偏移位置/位图数据到文件头的偏移位置9 BITMAPFILEHEADERBITMAPFILEHEADER;10 typedef structtypedef struct tagBITMAPINFOHEADERtagBITMAPINFOHEADER /位图信息头/位图信息头11 unsi
18、gned intunsigned int biSizebiSize;/位图信息头的长度/位图信息头的长度12 longlong biWidthbiWidth;/位图的宽度,以像素为单位/位图的宽度,以像素为单位13 longlong biHeightbiHeight;/位图的高度,以像素为单位/位图的高度,以像素为单位14 unsigned shortunsigned short biPlanesbiPlanes;/位图的位面数/位图的位面数15 unsigned shortunsigned short biBitCountbiBitCount;/每个像素的位数/每个像素的位数222210.3
19、.5 10.3.5 读写数据块读写数据块例10.516 unsigned intunsigned int biCompressionbiCompression;/数据压缩类型/数据压缩类型17 unsigned intunsigned int biSizeImagebiSizeImage;/位图数据大小(字节)/位图数据大小(字节)18 longlong biXPelsPerMeterbiXPelsPerMeter;/水平分辨率(像素/米)/水平分辨率(像素/米)19 longlong biYPelsPerMeterbiYPelsPerMeter;/垂直分辨率(像素/米)/垂直分辨率(像素/米
20、)20 unsigned intunsigned int biClrUsedbiClrUsed;/位图使用的颜色数/位图使用的颜色数21 unsigned intunsigned int biClrImportantbiClrImportant;/调色板规范/调色板规范22 BITMAPINFOHEADERBITMAPINFOHEADER;23 intint mainmain()()24 25 BITMAPFILEHEADER bmfhBITMAPFILEHEADER bmfh;26 BITMAPINFOHEADER bmihBITMAPINFOHEADER bmih;27 FILEFILE*
21、bmpbmp;28 printfprintf(%d,%d(%d,%dnn,sizeofsizeof(BITMAPFILEHEADERBITMAPFILEHEADER),),sizeofsizeof(BITMAPINFOHEADERBITMAPINFOHEADER););29 bmpbmp=fopenfopen(car.bmp,rb);(car.bmp,rb);232310.3.5 10.3.5 读写数据块读写数据块例10.530 ifif(bmpbmp!=!=NULLNULL)31 freadfread(&(&bmfhbmfh,sizeofsizeof(BITMAPFILEHEADERBITMAPFILEHEADER),),1 1,bmpbmp););32 freadfread(&(&bmihbmih,sizeofsizeof(BITMAPINFOHEADERBITMAPINFOHEADER),),1 1,bmpbmp););33 printfprintf(位图宽=%d,高=%d(位图宽=%d,高=%dnn,bmihbmih.biWidthbiWidth,bmihbmih.biHeightbiHeight););34 fclosefclose(bmpbmp););35 36 returnreturn 0 0;37 结束结束
限制150内