文件IO与标准IO的区别:
1.标准IO是库函数是对系统调用的封装
2.标准IO有缓存
3.文件IO是系统调用Linux内核函数接口
4.文件IO没有缓存
int open(const char *pathname, int flags);
功能:打开文件并获得文件描述符参数:pathname:打开文件路径首地址flags:打开标识O_RDONLY 只读O_WRONLY 只写O_RDWR 读写O_APPEND 追加O_CREAT 创建O_TRUNC 清0O_ASYNC 异步IOO_NONBLOCK 非阻塞IO返回值:成功返回新文件描述符失败返回-1 文件描述符:很小的非负整数 0 1 2 3 .. 0-1023新生成的文件描述符永远为最小的非负整数rwx421练习:使用文件IO模拟标准IO的所有打开方式"r" O_RDONLY "r+" O_RDWR "w" O_WRONLY | O_CREAT | O_TRUNC, 0664"w+" O_RDWR | O_CREAT | O_TRUNC, 0664"a" O_WRONLY | O_CREAT | O_APPEND, 0664"a+" O_RDWR | O_CREAT | O_APPEND, 0664 0: 标准输入
1: 标准输出
2: 标准出错
close
int close(int fd);
功能:
关闭文件描述符
ssize_t read(int fd, void *buf, size_t count);
功能:从文件描述符fd中读count个字节存放到buf指向的空间中参数:fd:文件描述符 buf:存放数据空间首地址count:想要读取的字节数返回值:成功返回实际读取的字节数失败返回-1 读到文件末尾返回0
ssize_t write(int fd, const void *buf, size_t count);
功能:向文件描述符中写入buf指向的count个字节数据参数:fd:文件描述符buf:存放数据空间首地址count:写入数据的字节数返回值:成功返回实际写入字节数失败返回-1 没有写入任何东西返回0
coff_t lseek(int fd, off_t offset, int whence);
功能:重定位一个文件描述符的偏移量参数:fd:文件描述符offset:偏移量> 0 向后偏移 < 0 向前偏移whence:SEEK_SET 文件开头SEEK_CUR 文件当前位置SEEK_END 文件末尾返回值:成功返回当前偏移量的值失败返回-1
可以这样看标准IO与文件IO的对应:
fopen -> open
fgetc fgets fscanf fread -> read
fputc fputs fprintf fwrite -> write
fseek ftell rewind -> lseek
fclose -> close
标准IO:文件流指针 FILE*
文件IO:文件描述符 int FILE* int
1.fileno获得文件流指针对应的文件描述符
2.feof判断文件是否读到末尾
3.ferror判断文件是否读取出错
4.clearerror清除错误信息
5.fdopen 通过已经打开的一个文件描述符获得其文件流指针
练习:
利用文件IO read、write等函数完成图片的拷贝
DIR *opendir(const char *name);
功能:打开一个目录并获得目录流指针参数:name:目录路径返回值:成功返回目录流指针失败返回NULL
int closedir(DIR *dirp);
功能:关闭目录流指针参数:dirp:目录流指针返回值:成功返回0失败返回-1
struct dirent *readdir(DIR *dirp);
功能:读取目录流中下一个目录项的信息参数:dirp:目录流指针 返回值:成功返回存放目录项信息的结构体指针失败返回NULL读到目录项末尾返回NULLstruct dirent {ino_t d_ino; /* inode number */off_t d_off; /* offset to the next dirent */unsigned short d_reclen; /* length of this record */unsigned char d_type; /* type of file; not supportedby all file system types */char d_name[256]; /* filename */
};
char *getcwd(char *buf, size_t size);
功能:获得当前所在工作目录的绝对路径参数:buf:存放绝对路径字符串空间首地址size:最大允许读取的字节数返回值:成功返回存放绝对路径空间首地址失败返回NULL
int chdir(const char *path);
功能:切换当前工作路径参数:path:新的工作路径返回值:成功返回0 失败返回-1
int mkdir(const char *pathname, mode_t mode);
功能:创建目录文件参数:pathname:目录文件的路径mode:权限 0664 0777返回值:成功返回0 失败返回-1 rwxr:能否在目录中查看所有文件信息w:是否能够在目录文件中创建新文件x:能否进入目录文件
int rmdir(const char *pathname);
功能:删除一个空目录参数:pathname:目录路径 返回值:成功返回0 失败返回-1
本章大作业:
(1)分别使用fgetc、fputc、fgets/fputs、fread/fwrite、read/write等函数实现文件拷贝
(2)从终端输入一个目录路径,找到该目录下所有的媒体文件并打印在终端
/home/linux/Music
“.mp3” “.mp4” “.avi” “.rm” “.rmvb” “.flv” “.wma”
(3)将一个指定ASCII码文件中所有的string1用string2替换
file.txt
hello
hi
加油,希望能早日找到工作!
o(╥﹏╥)o