C语言IO常用函数总结

一. 标准IO

1.1 打开文件

FILE *fopen(const char *pathname, const char *mode);
函数功能:打开文件
返回值:成功返回文件流指针,失败返回NULL
参数1:要打开文件的路径
参数2:打开的方式

r:以只读的方式打开文件,文件不存在则出错
r+:以可读可写的方式打开文件,文件不存在则出错
w:以只写的方式打开文件,文件不存在则新建,文件存在清空文件中的内容
w+:以可读可写的方式打开文件,文件不存在则新建,文件存在清空文件中的内容
a:以追加的方式打开只写的文件,文件不存在则新建,文件存在则追加到文件的末尾
a+:以追加的方式打开可读可写文件,文件不存在则新建,文件存在则追加到文件的末尾

1.2 关闭文件

int fclose(FILE *stream);
函数功能:关闭文件
返回值:成功返回0,失败返回EOF-1)
参数:fopen的返回值,已经打开的文件流指针
注意:EOF(end of file)只能判断是否到达文本文件的末尾,不能判断二进制文件

1.3 操作文件(读/写)

1.3.1 按字符读写
int fgetc(FILE *stream);
函数功能:从指定的流中读取一个字符
返回值:成功返回读到的ASCII码值,失败返回-1
参数:fopen的返回值,已经打开的文件流指针

int fputc(int c,FILE *stream);
函数功能:向指定的流中写入一个字符
返回值:成功返回读到的ASCII码值,失败返回-1
参数1:要写入的字符
参数2:fopen的返回值,已经打开的文件流指针

在这里插入图片描述

1.3.2 按行读写
char *fgets(char *s,int size,FILE *stream);
函数功能:从指定的流中读取一串字符
返回值:成功返回读到的内容空间首地址,失败返回NULL
参数1:要读取的内容空间的首地址
参数2:读多大
参数3:fopen的返回值,已经打开的文件流指针

int *gputs(char *s,FILE *stream);
函数功能:向指定的流中写入一串字符
返回值:成功返回非负的整数,失败返回-1
参数1:要写入的字符串的首地址
参数2:fopen的返回值,已经打开的文件流指针

总结:
fgets遇到换行符时会将换行符读入
fgets比gets更安全,最多读取size-1个字符
puts会自动添加换行符,而fputs不会

这里是引用在这里插入图片描述

1.3.3 按块读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
函数功能:按块读数据
返回值:成功返回读到的块个数,失败返回-1
参数1:要读取的内容空间的首地址
参数2:块的大小
参数3:块的个数
参数4:fopen的返回值,已经打开的文件流指针

size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *sream);
函数功能:按块读数据
返回值:成功返回写入的块个数,失败返回-1
参数1:要写入的内容空间的首地址
参数2:块的大小
参数3:块的个数
参数4:fopen的返回值,已经打开的文件流指针

这里是引用

1.3.4定位函数
long ftell(FILE *stream);
函数功能:获取当前文件的位置
返回值:成功返回当前文件的位置,失败返回-1
参数:fopen的返回值,已经打开的文件流指针

int fseek(FILE *stream,long offset,int whence);
函数功能:获取流的位置
返回值:成功返回当前坐标,失败返回-1
参数1:fopen的返回值,已经打开的文件流指针
参数2:偏移量
参数3:偏移的位置
      SEEK_SET:文件开头
      SEEK_CUR:当前位置
      SEEK_END:文件末尾
案例:
fseek(fp,10,SEEK_CUR);//从当前位置向后偏移10个字节
fseek(fp,0,SEEK_SET);//文件开头
fseek(fp,0,SEEK_END);//文件末尾

ftell和fseek的应用这里是引用在这里插入图片描述

1.3.5 feof
int feof(FILE *stream);
函数功能:判断文件是否到达文件末尾
返回值:非0表示到达文件末尾,为0表示没有到达文件末尾
参数:文件流指针
注意:feof即可以判断是否到达文本文件的末尾,也可以判断是否到达二进制文件的末尾

二. 文件IO

2.1 打开文件

头文件:
#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);
函数功能:打开文件
返回值:成功返回文件描述符,失败返回-1
参数1:文件的路径
参数2:打开文件的方式
			以下参数,必选其一:
			O_RDONLY:只读
			O_WRONLY:只写
			O_RDWR:可读可写
			其余的和上面的进行或运算
			O_CREAT:如果文件不存在,则新建(必须使用第三个参数)
			O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。
			O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。
			O_TRUNC:如文件已经存在,那么打开文件时先删除文件中原有数据。
			O_APPEND:以追加的方式打开文件,追加在文件的末尾
参数3:权限(一般用8进制数来表示)

2.2 关闭文件

头文件:
#include <unistd.h>
函数原型:
int close(int fd);
函数功能:关闭文件
返回值:成功返回0,失败返回-1
参数:open的返回值,已经打开的文件描述符

2.3 操作文件(读/写)

头文件:
#include <unistd.h>

函数原型:
ssize_t read(int fd, void *buf, size_t count);
函数功能:从文件中读取内容
返回值:成功返回读到的字节数,0表示文件末尾,-1表示读取失败
参数1:open的返回值,已经打开的文件描述符
参数2:要读取的内容空间首地址
参数3:要读的大小

ssize_t write(int fd, const void *buf, size_t count);
函数功能:向指定文件写数据
返回值:成功返回写入的字节数,0表示未写入,失败返回-1
参数1:文件描述符,open的返回值
参数2:写的内存空间的首地址
参数3:要写的大小

在这里插入图片描述

2.4 lseek

头文件:
#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
参数1:文件描述符
参数2:偏移量
参数3:偏移的位置(SEEK_SET:文件开头、SEEK_CUR:当前位置、SEEK_END:文件末尾)

这里是引用

三. 目录相关

3.1 打开目录

头文件:
#include <sys/types.h>
#incude <dirent.h>

函数原型:
DIR *opendir(const char *name);
函数功能:打开目录
返回值:成功返回DIR *,失败返回NULL
参数:目录的路径

3.2 关闭目录

int closedir(DIR *dirp);
函数功能:关闭目录
返回值:成功返回0,失败返回-1
参数:目录流

3.3 读目录

struct dirent *readdir(DIR *dirp);
函数功能:读取目录的内容
返回值:成功返回struct dirent *,失败返回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 */
              };

这里是引用

3.4 文件属性函数

头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

函数原型:
int stat(const char *pathname, struct stat *statbuf);
int fstat(int fd, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);
fstat测试的是已经打开的文件属性
stat:追踪函数,如果测试的是软链接,实际测的是源文件的属性
lstat:不追踪函数,如果测试的是软链接,实际就是自身的属性
struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* Inode number */
               mode_t    st_mode;        /* File type and mode */
               nlink_t   st_nlink;       /* Number of hard links */
               uid_t     st_uid;         /* User ID of owner */
               gid_t     st_gid;         /* Group ID of owner */
               dev_t     st_rdev;        /* Device ID (if special file) */
               off_t     st_size;        /* Total size, in bytes */
               blksize_t st_blksize;     /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */
               

测试文件大小
在这里插入图片描述在这里插入图片描述

四. 相关概念

4.1 什么是IO

I:input
o:output
输入:从键盘将数据输入到内存中
输出:从内存将数据拷贝到显示屏上

对IO更深层次的理解
Linux下一切皆文件
输入:从文件将数据输入到内存中
输出:从内存将数据拷贝到文件中

4.2 标准IO特点

标准IO由ANSI C标准说明

(1)可以跨平台,既可以在windows下使用,又可以在Linux上使用
(2)库函数
(3)有缓冲机制
(4)通过文件流指针来进行操作
(5)一般用于普通文件的操作

4.3 文件IO特点

(1)文件描述符(非负的整数)
(2)无缓冲机制
(3)系统调用
(4)一般用于设备文件的操作

4.4 文件类型

(1)普通文件 -
a、ASCII码文件(文本文件) b、二进制文件
(2)目录文件 d
(3)块设备文件 b
(4)字符设备文件 c
(5)链接文件 l
(6)管道文件 p
(7)套接字文件 (socket)s

4.5 系统调用

系统:操作系统
调用:调用函数
系统调用:调用操作系统提供的函数
系统调用:操作系统提供给应用程序的接口(函数)

4.6 缓冲区

作用:减少系统调用的次数
(1)全缓存:当缓冲区满、程序结束、强制刷新缓冲区时会刷新缓冲区
(2)行缓存:当缓冲区满、程序运行结束、强制刷新缓冲区、遇到换行符时会刷新缓冲区
(3)不缓存:没有缓存区,直接输出

程序运行起来之后,会默认打开三个文件,标准输入、标准输出、标准出错,对应的流指针分别为stdin、stdout、stderror

4.7 流和FILE指针

(1)每个被使用的文件都会在内存中开辟一个空间,用来保存文件的相关信息,这些信息保存在结构体中,取名为FILE
(2)标准IO中所有的操作都是围绕流来进行的,流用FILE *来描述

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值