一、标准IO
概念:标准是指遵循AVSI C标准,标准IO实际上是通过标准C库里面的函数来完成的。
特点:标准IO内部实现了一种缓冲机制 标准IO通过利用缓冲机制,减少系统调用的次数来提高程序执行效率;
标准IO一般用于访问普通文件,它是在文件IO的基础上添加了缓冲机制。
二、流
概念:文件IO操作简单从文件输入和输出数据,称为字节流,也叫作流。
流的类型:
1、文本流
文本流处理数据都是以字符的方式处理
最终所有数据都会转换为对应的ASCII码值处理
"hello" == 'h' 'e' 'l' 'l' 'o'
"1234" == '1' '2' '3' '4' 对应的ASCII码值:49 50 51 51
文本流和二进制流处理换行符方式不一样(Windows下面,linux下面没有区别)
文 本 流:'\n' == '\r' '\n' 13 10
二进制流:'\n' == '\n'
2、二进制流
二进制流处理数据都是以转换成二进制处理
"1234" == 100 1101 0010 //直接转成二进制流
三种特殊流:
stdin -- 标准输入流 -- 0 (键盘)
stdout -- 标准输出流 -- 1 (终端)
stderr -- 标准错误流 -- 2
三、缓冲区
1、全缓存:当打开一个普通文件时,默认使用全缓存
特点:只有当缓冲区满或者空时才能进行实际的读写操作
2、行缓存:当打开操作的文件跟终端相关时,使用行缓存
特点:当行缓存遇到'\n'或者缓冲区满的情况下才做读写操作
3、无缓存:当需要输出打印错误结果时用无缓存
特点:
四、标准IO相关函数
{
fopen()/fclose()
fgetc()/fputc()
fgets()/fputs()
fread()/fwrite()
feof()/ferror()
ftell()/fseek()/rewind()
}
首先先提一下利用man查看函数的使用方法:
{
man 1:可执行程序和shell命令
man 2:系统调用函数
man 3:标准库函数
}
1、打开文件
fopen()
#include <stdio.h>//头文件
FILE *fopen(const char *path, const char *mode)//函数原型
参数:
path:打开的文件名(可包含文件路径)
mode:打开文件方式
r :以只读方式打开文件 -- 文件不存在,则无法打开文件,打开文件会清空文件内容
r+:以读写方式打开文件 -- 文件不存在,则无法打开文件,打开文件会清空文件内容
w :以只写方式打开文件 -- 文件不存在,则创建文件在打开,打开文件会清空文件内容
w+:以读写方式打开文件 -- 文件不存在,则创建文件在打开,打开文件会清空文件内容
a :以只写方式打开文件 -- 如果文件不能存在则会先创建,并在文件末尾追加输入内容
a+:以只写方式打开文件 -- 如果文件不能存在则会先创建,并在文件末尾追加输入内容//换行追加
返回值:成功返回流指针,失败返回-1;
举例:FILE *fp = fopen("1.txt", "r+");
2、关闭流
fclose()
#include <stdio.h>//头文件
int fclose(FILE *fp)//函数原型
参数:关闭文件对应的流指针
返回值:成功返回0,失败返回-1.
举例:fclose(fp);
3、错误处理
errno:错误号
strerror()
(1) #include <string.h>
#include <errno.h>//需要添加头文件
char *strerror(int errnum)//函数原型
参数:
errno:错误号
返回值:
成功返回错误的字符串,失败返回"Ukown error!"
perror()
(2) #include <stdio.h>
void perror(const char *s);//比较常用
参数:
s:错误信息,随意填一个字符串
perror()//可以直接打印错误,不用添加头文件
举例:
if(NULL == fp)
{
// perror("open 1.txt.");
printf("%s\n",strerror(errno));
return -1;
}
4、按字节输入输出
fgetc()
#include <stdio.h>
int fgetc(FILE *stream)
功能:向指定流中输入单个字节
参数:
stream:对应的流指针
返回值:
成功:返回得到的字符
失败或者读到文件末尾:返回-1
fputc()
#include <stdio.h>
int fputc(int c, FILE *stream);
功能:向指定流中输出指定字符
参数:
c:要输出的字符
stream:指定的流指针
返回值:成功返回输出字符,失败或者读到文件末尾返回-1;
练习:
1、计算一个文件的大小
2、实现文件的复制
5、按行进行输入和输出
fgets()
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);
返回值:
成功返回得到输入字符串的首地址,失败返回NULL;
参数:
s:输入数据的首地址
size:输入一行数据的大小
stream:对应文件的流指针
注意:
fgets()输入时遇到'\n'结束
最大输入的字节数为(size-1)个
fputs()
#include <stdio.h>
int fputs(const char *s, FILE *stream);
参数:
s:输入数据的首地址
stream:对应文件的流指针
返回值:失败返回-1
练习:
1、计算文件的行数
2、实现文件的复制
6、按对象输入输出数据
fread()
void *表示可以传入任意类型的指针
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr:存放读取内容的首地址
size:一个对象的字节数大小(一次读多大字节的对象)
nemmb:读取对象的个数
stream:对应文件的流指针
返回值:
成功返回读写的对象个数
fwrite()
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
参数:
ptr:存放写入内容的首地址
size:一个对象的字节数大小(一次写多大字节的对象)
nemmb:写入对象的个数
stream:对应文件的流指针
返回值:
成功返回读写的对象个数
7、判断错误流 -- feof、ferror
feof()
#include <stdio.h>
int feof(FILE *stream);
返回值:
返回1表示只读到文件末尾,0表示失败
ferror()
int ferror(FILE *stream);
返回值:
返回1表示错误退出,0表示失败
8、刷新流fflush()
#include <stdio.h>
int fflush(FILE *stream);
参数:
stream:流指针
返回值:
成功返回0,失败返回-1;
9、定位流(文件指针)
-- ftell / fseek / rewind
#include <stdio.h>
ftell()
long ftell(FILE *stream);
参数:
stream:流指针
返回值:
成功返回文件指针相对于文件开头的偏移量,失败返回-1
fseek()
int fseek(FILE *stream, long offset, int whence);
参数:
stream:流指针
offset:偏移量
whence:定位基准点
{
SEEK_SET:定位在文件开头
SEEK_CUR:定位在文件指针当前位置
SEEK_END:定位在文件末尾
}
流的定位等于:偏移量+基准点
rewind()
功能:
void rewind(FILE *stream);
将文件指针定位在文件开头
sprintf
10、获取时间
ctime
#include <time.h>
time(&t);
char *ctime(const time_t *timep);
time
time_t time(time_t *tloc);
返回值:
成功返回字符串
localtime
struct tm *localtime(const time_t *timep);
truct tm {
int tm_sec; /* Seconds (0-60) */
int tm_min; /* Minutes (0-59) */
int tm_hour; /* Hours (0-23) */
int tm_mday; /* Day of the month (1-31) */
int tm_mon; /* Month (0-11) */
int tm_year; /* Year - 1900 */
int tm_wday; /* Day of the week (0-6, Sunday = 0) */
int tm_yday; /* Day in the year (0-365, 1 Jan = 0) */
int tm_isdst; /* Daylight saving time */
};
12、sprintf--补充
int sprintf(char *str, const char *format, ...);
参数:
str:输入数据的首地址
format:要写入str中的文本
练习:向文件中每隔一秒写入当前行数和时间
主要在于sprintf()的使用方法
第一天学习文件IO的笔记!!!!!