文件IO与标准IO的区别:
1.标准IO是库函数
是对系统调用的封装
2.标准IO有缓存
3.文件IO是系统调用
Linux内核函数接口
4.文件IO没有缓存
文章目录
一、文件IO
1、open
int open(const char *pathname, int flags);
功能:
打开文件并获得文件描述符
参数:
pathname:打开文件路径首地址
flags:打开标识
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
O_APPEND 追加
O_CREAT 创建
O_TRUNC 清0
O_ASYNC 异步IO
O_NONBLOCK 非阻塞IO
返回值:
成功返回新文件描述符
失败返回-1
文件描述符:
很小的非负整数 0 1 2 3 .. 0-1023
新生成的文件描述符永远为最小的非负整数
rwx
421
练习:使用文件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: 标准出错
2、close
int close(int fd);
功能:
关闭文件描述符
3、read
ssize_t read(int fd, void *buf, size_t count);
功能:
从文件描述符fd中读count个字节存放到buf指向的空间中
参数:
fd:文件描述符
buf:存放数据空间首地址
count:想要读取的字节数
返回值:
成功返回实际读取的字节数
失败返回-1
读到文件末尾返回0
4、write
ssize_t write(int fd, const void *buf, size_t count);
功能:
向文件描述符中写入buf指向的count个字节数据
参数:
fd:文件描述符
buf:存放数据空间首地址
count:写入数据的字节数
返回值:
成功返回实际写入字节数
失败返回-1
没有写入任何东西返回0
5、lseek
coff_t lseek(int fd, off_t offset, int whence);
功能:
重定位一个文件描述符的偏移量
参数:
fd:文件描述符
offset:偏移量
> 0 向后偏移
< 0 向前偏移
whence:
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
返回值:
成功返回当前偏移量的值
失败返回-1
6、文件IO扩展
可以这样看标准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等函数完成图片的拷贝
二、目录IO
1、opendir
DIR *opendir(const char *name);
功能:
打开一个目录并获得目录流指针
参数:
name:目录路径
返回值:
成功返回目录流指针
失败返回NULL
2、closedir
int closedir(DIR *dirp);
功能:
关闭目录流指针
参数:
dirp:目录流指针
返回值:
成功返回0
失败返回-1
3、readdir
struct dirent *readdir(DIR *dirp);
功能:
读取目录流中下一个目录项的信息
参数:
dirp:目录流指针
返回值:
成功返回存放目录项信息的结构体指针
失败返回NULL
读到目录项末尾返回NULL
struct 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 supported
by all file system types */
char d_name[256]; /* filename */
};
4、getcwd
char *getcwd(char *buf, size_t size);
功能:
获得当前所在工作目录的绝对路径
参数:
buf:存放绝对路径字符串空间首地址
size:最大允许读取的字节数
返回值:
成功返回存放绝对路径空间首地址
失败返回NULL
5、chdir
int chdir(const char *path);
功能:
切换当前工作路径
参数:
path:新的工作路径
返回值:
成功返回0
失败返回-1
6、mkdir
int mkdir(const char *pathname, mode_t mode);
功能:
创建目录文件
参数:
pathname:目录文件的路径
mode:权限 0664 0777
返回值:
成功返回0
失败返回-1
rwx
r:能否在目录中查看所有文件信息
w:是否能够在目录文件中创建新文件
x:能否进入目录文件
7、rmdir
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