C语言高级操作(二)——文件IO与目录IO

文件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

猜你喜欢

转载自blog.csdn.net/weixin_44463519/article/details/129670471