标准IO:读/写有缓冲区的
标准IO对象 -> 普通文件,例如: 访问1.txt,2.jpg,3.mp3..
标准I/O实例:
#include <stdio.h>
int main()
{
//以读写方式打开文件,如果文件不存在则创建,如果存在则清空内容,文件指针定位开头
FILE *fp = fopen("1.txt","w+");
if(fp == NULL)
printf("fopen error!\n");
//写入helloworld到1.txt文件里
char buf[10] = "helloworld";
fwrite(buf,10,1,fp);
//从1.txt文件里读取5个字节的数据出来
fseek(fp,0,SEEK_SET); //文件指针定位开头
char t[5];
fread(t,5,1,fp);
printf("t = %s",t); //输出hello
//关闭文件
fclose(fp);
return 0;
}
头文件:
#include <stdio.h>
函数原型:
//打开 / 关闭
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
//读 / 写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
//文件定位指针
int fseek(FILE * stream, long offset, int whence);
//获取当前文件指针距离开头的绝对值
long ftell(FILE *stream);
//重置文件指针的定位到开头
void rewind(FILE *stream);
//--------------------- 下面文件字符、字符串函数 ----------------------------
int getchar(void);
int getc(FILE *stream);
int putc(int c, FILE *stream);
char *gets(char *s); //危险,不推荐用
int puts(const char *s);
int fgetc(FILE *stream);
int fputc(int c, FILE *stream);
char *fgets(char *s, int size, FILE *stream);
int fputs(const char *s, FILE *stream);
函数参数详解:
//-------------------------------- 打开/关闭 ----------------------------
FILE *fopen(const char *path, const char *mode);
path: 需要访问的文件的路径
mode: 操作文件的权限
文件权限:
r: //以只读方式打开文件,文件的定位在文件的开头!
r+: //以读写方式打开文件,文件的定位在文件的开头!
w: //以只写方式打开文件,如果文件不存在则创建,存放则清空,文件的定位在文件开头
w+: //以读写方式打开文件,如果文件不存在则创建,存放则清空,文件的定位在文件开头
a: //以只写方式打开文件,以追加方式写入文件,文件不存在则创建,文件的定位文件的末尾。
a+: //以读写方式打开文件,以追加方式写入文件,不存在则创建,如果是读操作,则从文件定位
//在文件开头,如果是写操作,则文件的定位在末尾。
返回值:
成功:文件指针
失败:NULL
int fclose(FILE *fp);
fp: 需要关闭的文件流指针
返回值:
成功:0
失败:EOF
//--------------------------------- 读/写: --------------------------------
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:数据缓冲区
size: 每一个块的字节数
nmemb: 读取的块数
stream:文件流指针
返回值:
成功: 已经读取到的块数。
失败: 0
文件: 30 24 28
3 10 -> 3 3 10 -> 2 3 10 -> 2
2 15 -> 2 2 15 -> 1 2 15 -> 1
5 10 -> 3 5 10 -> 2 5 10 -> 2
(数量)(块)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:数据缓冲区
size: 每一个块的字节数
nmemb: 写入的块数
stream:文件流指针
返回值:
成功: 已经写入的块数。
失败: 0
//--------------------------------- 文件指针操作 --------------------------------
//文件指针定位函数:
int fseek(FILE * stream, long offset, int whence);
stream: 需要进行偏移的文件指针
offset: 需要偏移的偏移量
whence: 基准点
SEEK_SET -> 文件开头
SEEK_CUR -> 文件当前位置
SEEK_END -> 文件末尾
返回值:
成功:0
失败:-1
//获取当前文件指针距离开头的绝对值
long ftell(FILE *stream);
stream:需要获取当前位置距离开头的字节数的文件指针
返回值:
成功: 距离开头的偏移量
失败: -1
//重置文件指针的定位到开头
void rewind(FILE *stream);
stream: 文件指针
返回值:无!
//--------------------------------- 处理文件字符、字符串函数 -----------------------------
int getchar(void);
//从标准输入(stdin)里读取一个字符并将返回值unsigned char转换为int
int getc(FILE *stream);
//相当于fgetc()
int putc(int c, FILE *stream);
//相当于fputc()
int fgetc(FILE *stream);
//从流中读取一个字符并将返回值unsigned char转换为int,或文件结尾或错误的EOF。
int fputc(int c, FILE *stream);
//将c强制转换成无符号字符型再写入流中
char *gets(char *s); //危险,不推荐用
int puts(const char *s);
//将s写入到标准输出(stdout)里面
char *fgets(char *s, int size, FILE *stream);
//从流中读取size大小数据放进s里面。
int fputs(const char *s, FILE *stream);
//将字符串s写入流中
最后再补充一个printf的知识
printf()内容输出的条件:
1. 程序退出
2. 遇到\n
3. 缓冲区满了
4. 主动使用fflush刷新缓冲区
5. 使用fprintf()修改输出对象
6. 再次调用IO函数刷新缓冲区