标准IO是C语言官方提供的一套操作普通文件的IO接口:在只能操作普通文件,不能操作驱动设备文件。
标准IO的库: #include <stdio.h>
标准IO的接口: fopen ,fread,fwrite ,fclose.
标准输入设备:
stdin
标准输出设备:
stdout
标准出错:
stderr
标准IO接口是带缓存的!!
缓冲区的分类:
不缓冲:标准出错设备,系统IO。。。。
行缓冲: 标准输出设备,例如printf ‘\n’
全缓冲:一般的普通文件。。 (普通文件的缓冲区,是在操作的时候才会分配出来的)
设置缓冲区的大小:
函数名: setvbuf
用 法: int setvbuf(FILE *stream, char *buf, int type, unsigned size);
stream:需要设置的文件指针
buf : 期望缓冲区的地址;(假设为NULL时,使用的是内核缓冲区)
type : 期望缓冲区的类型:
_IOFBF(满缓冲):当缓冲区为空时,从流读入数据。或者当缓冲区满时,向流写入数 据。
_IOLBF(行缓冲):每次从流中读入一行数据或向流中写入一行数据。
_IONBF(无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。
size : 缓冲区内字节的数量。
返回值:成功返回 0
失败返回 非0
刷新缓冲区:
#include <stdio.h>
int fflush(FILE *stream);
//fopen函数的使用:
FILE *fopen(const char *path, const char *mode);
参数一:需要开的文件路径
参数二:打开的文件权限
“r” 只读
“r+” 读写
“w” 只写,文件不存在则,创建,存在则清空
“w+” 读写,文件不存在则,创建,存在则清空
“a” 只写,不存在创建,存在 追加
“a+” 读写,不存在创建,存在 追加
成功: 返回 一个文件指针
失败: 返回 NULL
//fwrite函数的使用:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数一:数据的缓冲区
参数二:每一个数据的大小 (类型为char,返回值才反应写入数据的大小)
参数三:多少个这样的数据
参数四:文件流指针
返回值:成功 返回写入的数据项数
失败 小于或等于0
注意:写入的数据大小为 size * nmemb
//fread函数使用:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数一:数据的缓冲区
参数二:数据块的大小 (类型大小)
参数三:数据块的个数
参数四:文件流指针
返回值:成功 返回读取的数据项数目
失败 返回小于或等于0
//文件指针的光标偏移函数使用:
NAME
fgetpos, fseek, fsetpos, ftell, rewind - reposition a stream
SYNOPSIS
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence); //偏移光标的位置
参数一:需要操作的文件指针
参数二:文件的偏移量
参数三:参考位置 :SEEK_SET 文件头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值: 成功 0
失败 -1
long ftell(FILE *stream); //获取一个文件偏移量
参数一:需要获取的文件指针
返回值:偏移量的大小
void rewind(FILE *stream);//把文件光标偏移到文件头部,相当于 fseek(FILE *stream,0,SEEK_SET)
int fgetpos(FILE *stream, fpos_t *pos); ->根据pos改变文件光标的位置
int fsetpos(FILE *stream, const fpos_t *pos);
判断文件是否读取完毕:
int feof(FILE *stream); //测试文件是否读完
int ferror(FILE *stream);//测试文件是否读错误
成功返回: 非0 真
失败返回: 0 假
-----------------------数据流操作-------每次只操作一个字符------------------
#include <stdio.h>
//读取一个字符
int fgetc(FILE *stream); //从一个文件指针中获取一个字符
int getc(FILE *stream);//跟fgetc是一样的,只不过该函数是一个宏
int getchar(void);//从标准输入设备中获取一个字符,等价于(fgetc(stdin))
//一般用于清空输入缓存区
while(getchar() != ‘\n’)
//输出一个字符
int fputc(int c, FILE *stream);//把一个字符写入到文件中
int putc(int c, FILE *stream);//跟fputc一样,只不过该函数是一个宏
int putchar(int c);//输出到标准输出中,等价于 (fputc(stdout))
----------------------数据行操作-------------------------------------
---------------------每次操作一行数据’\n’-----------------------------
//获取一行数据
char *fgets(char *s, int size, FILE *stream);
参数一:数据的缓冲区
参数二:需要获取的数据大小
参数三:需要获取的文件
返回值:成功 返回字符串的首地址
失败 返回 NULL
(注意:当读取到EOF 或者是 新行时,就是自动结束读取,并在字符串后添加 ‘\0’)
(他读到的实际数据为size - 1个数据)
//从键盘中获取一行数据到s中
char *gets(char *s); (不推荐使用,因为,他不能够指定数据长度容易越界!!)
fgets(char *s,int size,stdin);
//输出一行数据
int fputs(const char *s, FILE *stream);//输出一行数据,到stream中 (不会加\n,只加 '\0')
int puts(const char *s); //输出新的一行数据到 标准输出设备中 (自己加\n)
---------------------格式化IO接口------------------------------
printf:
int printf(const char *format, ...); //输出format格式数据到标准输出设备中
//参数一:输出的 format格式
int fprintf(FILE *stream, const char *format, ...); //输出format格式数据到 文件指针中stream
参数一:文件指针
参数二:输出的 format格式
int dprintf(int fd, const char *format, ...);//输出到文件描述符中
int sprintf(char *str, const char *format, ...);//输出到str的缓冲区中(用户自定义的) ****** 做字符串拼接很好用
int snprintf(char *str, size_t size, const char *format, ...);//指定size的长度到 buf中
scanf:
#include <stdio.h>
int scanf(const char *format, ...); //从标准输入设备中获取 format格式的 数据
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
format格式:
%d ->整形
%c ->字符
%s ->字符串
%p ->地址
%f ->浮点型 (常用)
%u ->无符号十进制整形
%o ->无符号8进制整形
%x ->无符号16进制整形
%e ->指数幂的形式 e
%.5s ->取前5个字符
#include <stdio.h>
#include <string.h>
int main()
{
//打开需要操作的文件
FILE *fd = fopen("1.c","r+");
if(fd == NULL)
{
perror("open fail:");
return -1;
}
char buf[1024]={0};
int ret = 0;
//循环读取一个文件
while(1)
{
memset(buf, 0, sizeof(buf));
ret = fread(buf,sizeof(char),1024,fd);
if(ret <= 0)
{
if(ferror(fd)) //判断是否读取错误
{
printf("读取文件错误\n");
}
if(feof(fd)) //判断是否读取完
{
printf("文件读到末尾\n");
break;
}
}
else
{
printf("%d\n",ret);
}
}
}