1. 标准I/O输入与输出
标准IO是由C语言提供的,所有接口基本上在stdio.h,标准IO中有一个FILE指针,每一个FILE指针都对应有一个打开的文件
缓冲:其实就是一块内存空间,使用标准IO打开文件不会立即送往操作系统,而是先存在缓冲中
缓冲分类:
1.行缓冲:遇到\n或者说满足一行就会把数据送往操作系统
2.全缓冲:直到缓冲区满才会把数据写出区
3.无缓冲:有数据直接写出
FILE指针默认每一进程有3个流是默认打开的:
stdin 标准输入
stdout 标准输出
stderr 标准错误
基本操作:
ps:主要运用于文件和终端的输入输出上
1.fopen 文件打开函数
FILE *fopen(const char *path, const char *mode);
path:带路径的文件名
mode:
r:只读 r+ :可读可写,光标停留在文件开头
w:只写 w+ :可读可写,如果文件不存在则创建文件,如果文件存在会把文件清空(光标在开头)
a:以追加方式打开 a+ :可读可写并以追加方式打开如果文件不存在,创建。
返回值: 成功返回FILE指针,失败返回NULL 并且errno被设置
文件的结束标识:EOF,不能操作它
fclose 关闭文件流
#include <stdio.h>
int fclose(FILE *fp);
fp:要关闭的FILE指针
返回值:成功返回0 失败返回-1(EOF)
注意:在fclose之前默认有一次fflush
2.fread–二进制读取和输出 input/output
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
从stream中读取nmemb块,每一块都是size个字节,把它存储到ptr指向的内存空间中
ptr:读取到的内容存储的地址
size:读取每一块的字节数大小
nmemb:有nmemb个记录
stream:打开的文件指针,你要从哪里读
返回值:成功返回,成功读取的记录数
失败,返回<=0
fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
把ptr指向的内存空间中的内容写入到strenm中,一共有nmemb块,每一块的大
小是size
ptr:要写入文件的内容首地址
size:要写入文本的字节数(每一块的大小)
nmemb:写入文件的快数
stream:要被写入的文件
3.fseek --定位文件流指针
int fseek(FILE *stream, long offset, int whence);
把光标定位在whence开始,偏移offset个字节
stream:打开的文件指针,要重定位光标的文件
offset:文件偏移量
whence:偏移起始位置
SEEK_SET:从文件开始
SEEK_END:文件末尾
SEEK_CUR:当前位置
返回:成功返回0
失败返回-1 errno被设置
4. fflush - 清空缓冲区
int fflush(FILE *stream);
把缓冲区中剩下的内容清空,并且写入文件流中
stream:缓冲区的内容写入stream文件流中
返回值: 成功返回0,失败返回-1
5.获取字符
int getc(FILE *stream);
int fgetc(FILE *stream);//getc与fgetc是等价的,都是从stream流中获取一个字符,然后通过返回值返回
int getchar(void);//getchar是标准输入中获取一个字符
int c=fgetc(fp);
int putchar(int c);//输出参数字符c 输出在标准输出
int putc(int c, FILE *stream);
int fputc(int c, FILE *stream);//输出在文件流stream中
返回:输出的一个字符
6.字符串的输出
char *fgets(char *s, int size, FILE *stream);
从文件流stream中获取字符串,大小为size,存储到s指向的地址中
返回值L:成功,返回获取到的字符串的首地址,
失败返回NULL
ps:最多只能从文件stream中读n-1个字节的大小,最后一个字节用来存储'\0'
int fputs(const char *s, FILE *stream);
功能:把s中存储的内容,输出到文件流stream中
s:存储的内容
stream:要写入的文件流指针
ps:fputs不会把最后字符串的'\0'写入文件流中
返回值:成功返回一个非负数
失败返回-1
char *gets(char *s);//gets没有限制字符个数,从标准输入中获取的字符串,
一直s指向的空间后面存储,容易导致段错误
int puts(const char *s);//把字符串s输出到标准输出中
返回值:成功返回一个非负数
失败返回-1(失败指的是文件读或者写发生错误或者文件已经读完了)
ps: gets是可以接收空格的字符串
gets遇到\n就停止,并且丢弃遇到的\n
fgets遇到\n就停止,并且默认在末尾最后一个字节添加'\0'
puts:会自动在输出的字符串后面添加\n
ex.使用标准IO拷贝文件的代码
7.其他函数
feof 检查光标是否达到文件尾
int feof(FILE *stream);
返回值:如果到达文件尾,返回1
否则返回0
long ftell(FILE *stream);
功能:返回光标所在stream中距文件开头的偏移量
int fgetpos(FILE *stream, fpos_t *pos);
功能:实现获取文件流光标的位置
pos:通过参数传回当前位置是pos
返回值:成功返回0
失败返回-1 errno被设置
int fsetpos(FILE *stream, fpos_t *pos);
pos:要设置的文件光标位置
返回值:成功返回0
失败返回-1 errno被设置
void rewind(FILE *stream);
功能:把文件光标重置为文件开始初
8.格式化输入与输出
#include <stdio.h>
int scanf(const char *format, ...);
默认是从标准输入上获取字符
控制字符:%d 后面的参数应该是int* 空白字符标识输入结束
%lf
%c 接收空白字符的
%s 不接收空格,遇到空白字符就结束
int fscanf(FILE *stream, const char *format, ...);
功能:从文件流中stream读取内存
返回值:返回成功匹配到的个数
int sscanf(const char *str, const char *format, ...);
功能:从字符串中读取格式化串中的内容
格式化输出:
#include <stdio.h>
int printf(const char *format, ...);//按照format指定的格式默认输在标准输出是上
int fprintf(FILE *stream, const char *format, ...);//输出到指定文件流中
int sprintf(char *str, const char *format, ...);//输出到指定的字符串中
返回值:返回成功输出额字符个数 hello--->5