文件的模式 Binary mod:文件中的每个比特都可以被程 文件操作 序访问到。比如 wav, bmp文件等。 ■ Text mode:存储的格式化的文本,程序所 操作的文本有可能和存储在文件系统中的 内容不一样(与操作平台相关) 高壮 ■Read:把文件上的回车和换行换成C/C++语 2007.10 中的回车和换 Write:把C/C++语言中的回车和换行换成文 件中的回车和换行 文件的模式 C语言的文件操作 ■在C语言中,文件的操作和结构体FE有不可分 ■一些常用的文件操作函数 size_t fwrite(const size t size, size t len, F size_t size, size_t len, FILE* fp) int fprintf(FIlE*ip, const char* format,; n int fscanf(FILE"fp, const char* format, ed scarahr'n o her heaving bosun ' r'n m int putc( int c, FILE. fp); C语言的文件操作 C语言的打开文件操作 ■一些常用的文件定位函数: a FILE *fopen( const char *filename, const char long ftell(FIlE*fp) *node ) ■参数 int fsetpos(FILE*fp const fpos_t*cur): 例子: 文件名 c( SEEK_CUR表示从当前位置向后核动个字 ■打开的模式,权限,格式 得到当前的文件位置 ■ Return value 勺读写位置。cur实际上是 对其运算,比如cur+ 指向打开的文件的指针,如果打开文件错 误,则返回NUI
1 文件操作 高壮 2007.10 文件的模式 Binary mod:文件中的每个比特都可以被程 序访问到。比如wav,bmp文件等。 Text mode:存储的格式化的文本,程序所 操作的文本有可能和存储在文件系统中的 内容不一样(与操作平台相关) Read: 把文件上的回车和换行换成C/C++语 言中的回车和换行 . Write: 把C/C++语言中的回车和换行换成文 件中的回车和换行. 文件的模式 C语言的文件操作 在C语言中,文件的操作和结构体FILE有不可分 割的作用. 一些常用的文件操作函数: FILE * fopen(const char * filename, const char * openmode); size_t fwrite(const void * data, size_t size, size_t len, FILE * fp); size_t fread(void * date, size_t size , size_t len , FILE * fp); int fprintf(FILE * fp, const char * format, ...); int fscanf(FILE * fp, const char * format, ...); int putc( int c, FILE * fp); int getc( FILE * fp); int fclose(FILE * fp); C语言的文件操作 一些常用的文件定位函数: long ftell(FILE *fp) int fseek(FILE * fp, long offset, int origin); int fgetpos(FILE * fp, fpos_t *cur); int fsetpos(FILE * fp const fpos_t *cur); 例子: fseek(fp,9,SEEK_CUR);表示从当前位置向后移动9个字 符;(其中SEEK_CUR 1;SEEK_END 2;SEEK_SET 0) fpos_t cur; fgetpos(fp,&cur);得到当前的文件位置, 可以通过fsetpos(fp,cur)设置fp的读写位置。cur实际上是 int64,所以可以对其运算,比如cur++; C语言的打开文件操作 FILE *fopen( const char *filename, const char *mode ); 参数 filename 文件名 mode 打开的模式,权限,格式 Return Value 返回一个指向打开的文件的指针,如果打开文件错 误,则返回NULL
文件的读写模式 文件的打开格式 一个文件用于读取数据,如果文件不存在,则打开失败,返回 ■以文本格式打开文件 杯在个商雋嬰淼孬释:果文件不存在,则创建新文件,如果文 ■以2进制的方式打开文件。不对文件的回车和换 打开一个文件用于追加数据,如果文件不存在,则创建新文件 行进行转换 打开一个文件进行读写,如果文件不存在,则打开失败,返回NUL 注意 轻开则需瓞蹉芟釋罗:果 t/b标签必须放在r/w/a的后面。 FIE*fp= fopen(stsr";wt);正确 打开一个文件用来读取或者追加数据,如果文件不存在,则创建新文 ■FIE*p= fopen( est. txt,"w),错误 C文件操作示例 C文件操作示例(续) #include ■■■ a fseek(Ep, 0, SEEK_SET) #inchude char str 2(100), str3 [1001 size_t len=fread(str 2, sizeof(char), strlen(str), fp); FILE'fp=fopen( test.txt", w+t); str2[en]=\0 printf"%os\n%os\n", str2, str3); char str= This is the test line fwrite(str, sizeof(char), strlen(str), p) ■ fprintf(p," print=°as"str C++的文件流操作 C++的文件流操作 s basic_fstream( const char * Filename, 可以创建的文件流包含 ios_base: : openmode_Mode= ios_ base in I ■输入文件流 ios_base: :out ) ifstream ifs( filename" ,ios base:in;两种打开方式 构造一个 basic_ istream类型 ■输出文件流 a Parameters a ofstream ofs (filename ,ios_base: out); ■输入输出文件流 要打开的文件名。 fstream fs; fs.open( filename ,ios_base base: out) Mode 打开模式, ios_hasesopenmode的一些枚举的组合
2 文件的读写模式 "r" 打开一个文件用于读取数据,如果文件不存在,则打开失败,返回 NULL。 "w" 打开一个文件用来写入数据,如果文件不存在,则创建新文件,如果文 件存在,则清空原始文件!!!。 "a" 打开一个文件用于追加数据,如果文件不存在,则创建新文件。 "r+" 打开一个文件进行读写,如果文件不存在,则打开失败,返回NULL。 "w+" 打开一个文件进行读写,如果文件不存在,则创建新文件,如果文件存 在,则清空原始文件!!!。 "a+" 打开一个文件用来读取或者追加数据,如果文件不存在,则创建新文 件。 文件的打开格式 t 以文本格式打开文件。 b 以2进制的方式打开文件。不对文件的回车和换 行进行转换。 注意: t/b标签必须放在r/w/a的后面。 FILE *fp=fopen(“test.txt”,“wt”);正确 FILE *fp=fopen(“test.txt”,“tw”);错误 C文件操作示例 #include #include int main() { FILE *fp=fopen("test.txt","w+t"); if(!fp) { printf("erroe on openning!\n"); return -1; } char * str="This is the test line"; fwrite(str,sizeof(char),strlen(str),fp); fprintf(fp,"print= %s",str); C文件操作示例(续) fseek(fp,0,SEEK_SET); char str2[100],str3[100]; size_t len=fread(str2,sizeof(char),strlen(str),fp); str2[len]='\0'; fscanf(fp,"print = %s",str3); printf("%s\n%s\n",str2,str3); fclose(fp); return 0; } C++的文件流操作 basic_fstream( const char *_Filename, ios_base::openmode _Mode= ios_base::in | ios_base::out ); 构造一个basic_fstream类型. Parameters _Filename 要打开的文件名。 _Mode 打开模式, ios_base::openmode的一些枚举的组合. C++的文件流操作 可以创建的文件流包含: 输入文件流: ifstream ifs(“filename”,ios_base::in);两种打开方式。 输出文件流: ofstream ofs(“filename”,ios_base::out); 输入输出文件流: fstream fs; fs.open(“filename”,ios_base::in|ios_base::out)
文件打开模式 C的文件模式用C++表示 ■app追加模式,但是开始时,数据流指向文件首 a ios_base::out I ios_ base: trunc=w ■ate,追加模式,但是开始时,数据流指向文件的尾 m ios_base:out ios_base: app=a 兴二进制模式打开文件,默认的是以文本 a ios_base: in I ios__base:out I ios_base:trunc 输入模式。 s ios_ base: in I ios_ base:out I ios_base:app out输出模式。 trunc,如果文件不存在,则创建新文件。默认是 不创建的。如果文件存在,则清空其内容 C++文件的定位操作 C++文件的定位操作 a basic_istream: : seekg ■设置输出流的位置 ■设置输入流的位置 s basic_ostream& seekp( pos Pos ) ■ basic istream& seekg( pos_type_ Pos ) basic_ostream& seekp( off basic_istream& seekg( off_type_O, ios_base:seekdir_W ay); ios_base: seekdir-_W ay ) Parameters Ps:数据流中的位置 ■_O:偏移量 WFay:输出位置。 ios baser seekin的枚举 WFa:初始值 ios basesseekd C++文件的定位操作 C++文件的定位操作 pos_type tell(; ■在文件中偏移定位时的初始值: ■返回当前的位置。 ■ ios baser: beg,数组,流,文件的开始位置 ■注意: 数组,流,文件的当前位置 ■在输入输出流 fstream fs中 ■ ios base:end,数组,流,文件的结束位置 fs seekp和 fs seeke设置位置时将同时影响输入输 出的位置。(是不是内部是一个值在作用?) 取的位置,同样对于 ofstream ofs,只可以用 fs seekp设置写入的位置
3 文件打开模式 app,追加模式.,但是开始时,数据流指向文件首 部。 ate,追加模式,但是开始时,数据流指向文件的尾 部。 binary, 以二进制模式打开文件,默认的是以文本 模式打开。 in, 输入模式。 out,输出模式。 trunc, 如果文件不存在,则创建新文件。默认是 不创建的。如果文件存在,则清空其内容。 C的文件模式用C++表示 ios_base::in ="r" ios_base::out | ios_base::trunc = "w" ios_base::out | ios_base:: app ="a" ios_base::in | ios_base::out = "r+“ ios_base::in | ios_base::out | ios_base::trunc ="w+" ios_base::in | ios_base::out | ios_base::app = "a+" C++文件的定位操作 basic_ostream::seekp 设置输出流的位置。 basic_ostream& seekp( pos_type _Pos ); basic_ostream& seekp( off_type _Off, ios_base::seekdir _Way ); Parameters _Pos : 数据流中的位置.。 _Off : 偏移值.。 _Way : 输出位置。ios_base::seekdir的枚举。 C++文件的定位操作 basic_istream::seekg 设置输入流的位置. basic_istream& seekg( pos_type _Pos ); basic_istream& seekg( off_type _Off, ios_base::seekdir _Way ); Parameters _Off : 偏移量. _Pos : 数据流的绝对位置. _Way : 初始值 ios_base::seekdir. C++文件的定位操作 pos_type tellp( ); 返回当前的位置。 注意: 在输入输出流fstream fs中。 fs.seekp和fs.seekg设置位置时将同时影响输入输 出的位置。(是不是内部是一个值在作用?) 对于输入流ifstream ifs,只可以用ifs.seekg设置读 取的位置,同样对于ofstream ofs,只可以用 ofs.seekp设置写入的位置。 C++文件的定位操作 在文件中偏移定位时的初始值: ios_base::beg, 数组,流,文件的开始位置 ios_base:: cur, 数组,流,文件的当前位置. ios_base:: end,数组,流,文件的结束位置
C++文件的读取操作 C++文件的写入操作 a basic_istream& read( char_type*_Str, te( const char_ type *_Sir, streamsize_Count ) Parameters a Parameters ■保存数据的缓冲区 将要写入的数据 Count ■Cont 将要读取的数据量(以char,及字节为单位 写入的数据量,以字节为单位 ■思考 为什么read/ write的返回值不是nt,代表处理了多少个 数据?对照函数: size t fread(void*date, suze t siz size_t len, FILE*fp C++文件的写入操作 C++文件处理的示例 ■因为C++文件的操作符问题 C++的文件可以利用操作符来简单的使用: fs>>c;读取 ofs>str3: 起见,这里假设处理的是24bit的rgb非压缩的 printf"os\n os\n",str2, str3) 件格式 fs. close; return u ■为了p的简洁,后面的示例没有注释
4 C++文件的读取操作 basic_istream& read( char_type *_Str, streamsize _Count ); Parameters _Str 保存数据的缓冲区. _Count 将要读取的数据量(以char,及字节为单位). C++文件的写入操作 basic_ostream& write( const char_type *_Str, streamsize _Count ); Parameters _Str 将要写入的数据 _Count 写入的数据量,以字节为单位。 思考: 为什么read/write的返回值不是int,代表处理了多少个 数据? 对照函数:size_t fread(void * date, size_t size , size_t len , FILE * fp); C++文件的写入操作 因为C++文件的操作符问题. C++的文件可以利用操作符来简单的使用: ifs>>c; 读取c; ofs #include using namespace std; int main() { fstream fs("test.txt",ios_base::in|ios_base::out); if(!fs) { cout>str3; printf("%s\n%s\n",str2,str3); fs.close(); return 0; } bmp文件的处理示例 问题: 对于一个bmp位图进行读写,掌握了这种方 法,以后,可以自己练习读写wav文件,并且 可以制作简单的wav文件处理程序。为了简单 起见,这里假设处理的是24bit的rgb非压缩的 bmp文件格式。 为了ppt的简洁,后面的示例没有注释
bmp文件的处理示例 bmp文件的处理示例 cerro"Can not B 1COLOR anr main cour<<"This is NOT a bitmap filalI\n: bmp文件的处理示例 bmp文件的处理示例 NFOHEADER bitmapInfoHeader, ■处理结果 D(BITMAPINHEADER] nfoH leader, biHleightbitmapInfoHeader biW ithi++)
5 bmp文件的处理示例 #include #include #include using namespace std; typedef struct mycolor { char r; char g; char b; }COLOR; int main() { BITMAPFILEHEADER bitmapFileHeader; memset(&bitmapFileHeader,0,sizeof(BITMAPFILEHEADER)); fstream fs("test.bmp",ios_base::in|ios_base::out|ios_base::binary); bmp文件的处理示例 if(!fs) { cerr<<"Can not open the file\n"<<endl; return -1; } fs.read((char*)&bitmapFileHeader,sizeof(BITMAPFILEHEADER)); if(0x4d42==bitmapFileHeader.bfType) cout<<"This is a bitmap file\n"; else { cout<<"This is NOT a bitmap file!!\n"; fs.close(); return -1; } bmp文件的处理示例 BITMAPINFOHEADER bitmapInfoHeader; memset(&bitmapInfoHeader,0,sizeof(BITMAPINFOHEADER)); fs.read((char*)&bitmapInfoHeader,sizeof(BITMAPINFOHEADER)); cout<<dec<<"the bit of color is" <<bitmapInfoHeader.biBitCount<<endl; fs.seekp(bitmapFileHeader.bfOffBits,ios_base::beg); COLOR c; c.r=0x80; c.g=0x80; c.b=0x00; for(int i=0;i<bitmapInfoHeader.biHeight*bitmapInfoHeader.biWidth;i++) fs<<c.b<<c.g<<c.r; fs.close(); } bmp文件的处理示例 处理结果