)
6. 文件IO文件IO Linux内核提供的文件操作接口。属于系统调用。学习接口打开文件 open()读文件、写文件 : read() 、write()关闭文件 : close()函数接口open#include sys/types.h #include sys/stat.h #include fcntl.h int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); 功能打开一个文件并获得一个文件描述符 参数 pathname要打开的文件的文件名 flags打开方式 O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 O_CREAT 创建 O_TRUNC 清空 O_APPEND 追加 r O_RDONLY r O_RDWR w O_WRONLY | O_TRUNC | O_CREAT 0664 w O_RDWR | O_TRUNC | O_CREAT0664 a O_WRONLY | O_CREAT | O_APPEND 0664 a O_RDWR | O_CREAT | O_APPEND 0664 mode用户自己、同组用户、其他用户对该文件的读写执行权限 (mode ~umask) 普通文件0664 权限给满0777 rwxrwxr-x 返回值 成功文件描述符 失败-1文件描述符当打开一个文件时系统会为已打开的文件分配一个文件描述符用来标记该文件。文件描述符小的非负的整形数据操作系统默认可分配出的文件描述符0-1023 总共1024个文件描述符的分配原则最小未被使用系统默认已打开的文件标准IO: 文件IOFILE * intstdin 0STDIN_FILENOstdout 1STDOUT_FILENOstderr 2 (STDERR_FILENO)close#include unistd.h int close(int fd); 功能关闭文件 参数 fd文件描述符 返回值 成功0 失败-1 注意 只打开文件使用完不关闭文件会造成文件描述符泄露。writessize_t write(int fd, const void *buf, size_t count); 功能向文件中写入数据 参数 fd 要写入的文件描述符 buf要写入的数据首地址 count希望写入的字节数 返回值 成功实际写入的字节数 失败-1readssize_t read(int fd, void *buf, size_t count); 功能从文件中读取数据 参数 fd要读的文件的文件描述符 buf存储读取数据的空间首地址 count希望读到的字节数 返回值 成功返回实际读到的字节数 失败-1 到达文件文件末尾0文件拷贝int file_copy(const char *srcfile, const char *dstfile) { int fdsrc open(srcfile, O_RDONLY); int fddst open(dstfile, O_WRONLY | O_CREAT | O_TRUNC, 0664); if (-1 fdsrc || -1 fddst) { printf(open error\n); return -1; } char buff[1024] {0}; ssize_t size 0; while ((size read(fdsrc, buff, sizeof(buff))) 0) { write(fddst, buff, size); } close(fdsrc); close(fddst); return 0; } 文件定位函数lseekoff_t lseek(int fd, off_t offset, int whence); 功能重新定位文件的读写位置 参数 fd文件描述符 offset偏移量 whence要偏移的起始位置 SEEK_SET :从文件开头偏移 SEEK_CUR: 从当前读写位置偏移 SEEK_END 从文件末尾偏移 返回值 成功返回当前读写位置到文件开头的偏移量 失败-17 .文件IO和标准IO的区别标准IO文件IO操作对象FILE *文件流指针操作对象fd 文件描述符标准C库函数可移植性强Linux系统调用可移植性弱有缓冲区减少用户层和内核层反复切换提高效率无缓冲区实时性好主要用在对普通文件操作普通文件、硬件设备类相关的文件缓冲区行缓冲默认大小1024字节1K主要使用在人机交互终端上。刷新条件遇到\n刷新程序结束刷新使用fflush强制刷新缓冲区满时自动刷新全缓冲默认大小4096字节4K文件交互刷新条件程序结束刷新文件关闭自动刷新全缓冲区满时自动刷新使用fflush强制刷新无缓冲0k 出错信息输出标准出错设备stderr8.目录IO打开目录文件opendir()读目录文件 readdir()关闭目录文件 closedir()opendirDIR *opendir(const char *name); 功能打开目录文件并获得目录流指针 参数 name目录名 返回值 成功目录流指针 失败NULLclosedirint closedir(DIR *dirp); 功能关闭目录文件 参数 dirp目录流指针 返回值 成功 0 失败-1readdirstruct dirent *readdir(DIR *dirp); 功能从目录流中读取数据 参数 dirp目录流指针 返回值 成功struct dirent 指针代表读到的文件信息 失败NULL 文件末尾NULL struct dirent { ino_t d_ino; /* Inode number */ off_t d_off; /* Not an offset; see below */ unsigned short d_reclen; /* Length of this record */ unsigned char d_type; /* Type of file; not supported by all filesystem types */ char d_name[256]; /* Null-terminated filename */ }; 命令mkdir创建文件夹touch创建普通文件openfopenmkdir;int mkdir(const char *pathname, mode_t mode); 功能创建一个目录文件文件夹 参数 pathname目录名称 mode目录文件的操作权限 返回值 成功0 失败-1目录遍历int main(void) { DIR *pdir opendir(/dev); if (NULL pdir) { printf(opendir error\n); return -1; } while (1) { struct dirent *pinfo readdir(pdir); if (NULL pinfo) { break; } if (. pinfo-d_name[0]) { continue; } printf( %s : %ld\n, pinfo-d_name, pinfo-d_ino); } closedir(pdir); return 0; }9. 其他int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); 功能将格式化后的字符串写入到stream文件流代表的文件中。 int dprintf(int fd, const char *format, ...); 功能将格式化后的字符串写入到fd所代表的文件中。 *int sprintf(char *str, const char *format, ...); 功能将格式化后的字符串写入到字符型数组中 字符串的拼接格式化 可以将整形数据、浮点型数据等转换成字符串char *strtok(char *str, const char *delim); 功能字符串截取函数 参数 str要截取的原始字符串 delim要截断的分隔符 返回值 成功截取到的子字符串的首地址 失败NULL已经到字符串末尾errno is set出错处理函数strerrorchar *strerror(int errnum); 功能将错误码转换成对应的错误信息字符串 参数 errnum错误码errno 返回值 成功返回错误码对应的字符串首地址 失败NULLperrorvoid perror(const char *s); 功能打印自己的出错处理信息和系统系统给出的出错原因。