230 likes | 398 Views
第十八章. 文件应用. 回顾. 流和文件 文本流和二进制流 文本文件和二进制文件的打开和关闭 字符的读写 字符串的读写 二进制数据的读写 测试函数. 目标. 解释文件指针 讨论当前活动指针 解释文件级操作函数 盘符操作 目录操作. 当前活动指针. FILE 结构提供了一个指针,用以跟踪发生 I/O 操作的位置 每当从流中读取或写入一个字符,当前活动指针(即 curp )就会向前移动 当前活动指针的当前位置可以借助 ftell() 函数来获得,函数原型:. long int ftell(FILE *fp);. 文件指针.
E N D
第十八章 文件应用
回顾 • 流和文件 • 文本流和二进制流 • 文本文件和二进制文件的打开和关闭 • 字符的读写 • 字符串的读写 • 二进制数据的读写 • 测试函数
目标 • 解释文件指针 • 讨论当前活动指针 • 解释文件级操作函数 • 盘符操作 • 目录操作
当前活动指针 • FILE 结构提供了一个指针,用以跟踪发生 I/O 操作的位置 • 每当从流中读取或写入一个字符,当前活动指针(即 curp)就会向前移动 • 当前活动指针的当前位置可以借助 ftell() 函数来获得,函数原型: long int ftell(FILE *fp); 文件指针 • 返回值:成功时返回文件指针位置,否则返回-1L
rewind()函数 • 功能说明:将文件位置指示器置于文件开头相当于reset(重置)文件指针 • 函数原型: void rewind(FILE * fp) ; 需重定位的文件指针 • 返回值:无
设置当前位置2-1 • 功能说明:通过指定相对于开始位置、当前位置或流的末尾位置的字节数来重定位 curp,这取决于 fseek() 函数中指定的位置 • 函数原型: int fseek (FILE *fp, long int offset, int origin); 需设置的文件指针 偏移量 搜索的起始位置 • 返回值:无
设置当前位置2-2 • origin 表示搜索的起始位置,有以下几个值: • #define SEEK_CUR 1 • #define SEEK_END 2 • #define SEEK_SET 0
#include <stdio.h> int main(){ long filesize=0; FILE *fpIn = NULL; FILE *fpOut = NULL; fpIn = fopen( "L19.exe","rb" ); if (fpIn == NULL){ puts("File Open Fail!"); return 0; } fseek(fpIn,0,2); filesize=ftell(fpIn); printf("file size : %ld",filesize); rewind(fpIn); fclose(fpIn); return 0; } /*对该段代码进行扩展,实现文件切割*/ 求文件大小示例
判断文件是否存在 • 功能说明:确定文件的访问权限 • 函数原型: int access(const char *filename,int amode); 需重判断的文件名 amode为0时,判断文件是否存在,为2时测试文件是否可写 • 头文件:io.h • 返回值:测试文件存在时,文件存在返回0,否则返回-1;测试文件是否可写时,可写返回0,否则返回-1
删除文件 • 功能说明:该函数用于删除指定文件,实际调用的是unlink函数 • 函数原型: int remove(const char *filename); 需重删除的文件名 • 返回值:成功删除返回0,否则返回-1
重命名文件 • 功能说明:为文件进行重新命名 • 函数原型: int rename(const char *oldname,const char *newname); 原文件名 新文件名 • 参数:两个参数都是字符串(可以包含路径,可以是绝对路径或者是相对路径)。 • 返回值:重命名成功返回0,否则返回-1
文件操作示例 #include <stdio.h> #include <io.h> int main(){ if (access("temp.txt",0) == 0){ int result = rename("temp.txt","abc.txt"); if (result == 0){ puts("File Rename Success!"); } } else{ puts("File Not Exists!"); } return 0; }
清除流 • 功能说明:fflush() 函数根据文件类型清除缓冲区 • 如果打开文件进行读操作,该函数将清空文件的输入缓冲区;而打开文件进行写操作时;该函数将文件的输出缓冲区写入文件中 • fflush() 函数的参数为空值,则清除所有被打开用于输出的文件 • 函数原型: int fflush(FILE *fp); 需清除的文件指针 • 返回值:成功时返回0,否则一旦出错返回EOF
标准流 • 每当 C 程序在 DOS 下开始执行时,操作系统将自动打开 5 个专门的流 • 标准输入流 (stdin) • 标准输出流 (stdout) • 标准错误流 (stderr) • 标准打印流 (stdprn) • 标准辅助流 (stdaux)
盘符和目录操作 • ANSI标准中没有定义盘符与目录操作函数,必顺通过开发商提供的库函数或当前系统API函数来操作盘符与目录 • VC6.0中定义了一套对盘符与目录操作函数,放在direct.h里 • 也可以利用system()函数,参数跟上DOS的命令
_getdrive()函数 • 功能说明:获取当前的盘符编号(1为A盘,2为B盘,以此类推) • 函数原型: int _getdrive( void ); • 参数:无 • 返回值:返回当前盘符编号
_chdrive()函数 • 功能说明:改变当前工作盘符 • 函数原型: int _chdrive( int drive ); 新的盘符编号 • 返回值:改变成功返回0,失败返回-1
列举所有盘符示例 #include <stdio.h> #include <direct.h> int main( void ){ int drive, curdrive; curdrive = _getdrive(); /* 先将原来工作盘符保存*/ printf( "Available drives are:\n" ); for( drive = 1; drive <= 26; drive++ ) { /* 如果盘符存在,则可改变当前的工作盘符*/ if( !_chdrive( drive ) ) printf( "%c:\n", drive + 'A' - 1 ); } _chdrive( curdrive ); /* 恢复原来的工作盘符*/ }
_mkdir()函数 • 功能说明:创建一个新的目录 • 函数原型: int _mkdir( const char *dirname ); 新的目录名 • 参数:新的目录名可以是绝对路径也可以是相对路径 • 返回值:创建成功返回0,失败返回-1
_rmdir()函数 • 功能说明:删除指定的空目录(不能将一个非空目录删除) • 函数原型: int _rmdir( const char *dirname ); 要删除的目录名 • 返回值:删除成功返回0,失败返回-1
_chdir()函数 • 功能说明:改变当前的工作目录 • 函数原型: int _chdir( const char *dirname ); 新的工作目录名 • 返回值:改变成功返回0,失败返回-1
_getdcwd()函数 • 功能说明:获取指定盘符的当前工作目录 • 函数原型: char *_getdcwd( int drive, char *buffer, int maxlen ); 盘符编号 接收当前工作目录名的缓冲区 最大的路径名长度通常取_MAX_PATH • 返回值:成功时返回缓冲区首地址,失败返回NULL值
总结 • 文件指针 • 当前活动指针 • 文件级操作函数 • 盘符操作 • 目录操作