C库中定义的一组用于输入输出的函数接口
(1)通过缓冲机制减少系统调用,提高效率
(2)围绕流进行操作,流用FILE *表示
(3)标准IO默认打开了三个流,stdin(标准输入)、stdout(标准输出)、stderr(标准错误)
(4)只能操作普通文件
ctags索引的使用:
1.vi -t 要查找的内容(查找宏,结构体,数据类型等)
2.继续追踪
光标定位在要追溯内容 Ctrl+]
后退 Ctrl+t
1.全缓冲:跟文件相关
刷新缓冲区的方法:
程序正常运行结束退出
缓冲区满
强制刷新fflush
2.行缓冲:跟终端相关
刷新缓冲区的方法:
\n 换行
程序正常运行结束退出
缓冲区满
强制刷新fflush
3.不缓冲:没有缓冲区,标准错误
#include
int main(int argc, char const *argv[])
{
//1.\换行刷新缓冲区
printf("hello world\n");
while(1);
//2.程序正常运行结束
printf("hello world");
//3.缓冲区满
//方法一:
for(int i=0;i<200;i++)
{
printf("%4d",i);
}
while (1)
//方法二:
printf("buf:\n");
printf("%d\n",stdout->_IO_buf_end-stdout->_IO_buf_base);
//4.强制刷新fflush
printf("hello world");
fflush(NULL);
while (1)
//标准错误不是缓冲
perror("hello world");
while(1)
;
return 0;
}
r:只读,当文件不存在时报错,文件流定位到文件开头
r+:可读可写,当文件不存在时报错,文件流定位到文件开头
w:只写,文件不存在时创建,存在则清空
w+:可读可写,文件不存在时创建,存在则清空
a:追加(在末尾写),文件不存在时创建,存在时追加,文件流定位到文件末尾
a+:可读可追加,文件不存在时创建,存在时追加,读文件流定位到开头,写文件流定位到末尾
ps:当以a方式打开文件时,写只能在末尾进行追加,定位操作是无法改变写的位置,但是可以改变读的位置
返回值:成功:文件流
失败:NULL,并设置错误码
#include
int main(int argc, char const *argv[])
{
FILE *fp = fopen("1.txt","w");
if(NULL == fp)
{
perror("fopen fp error!");
return -1;
}
printf("fopen success\n");
return 0;
fclose(fp);
}
每次读写一个字符fgetc fputc
返回值:成功:返回读到的字符
失败或读到文件末尾:EOF(-1)
#include
int main(int argc, char const *argv[])
{
FILE *fp = fopen("a.txt", "r+");
if (NULL == fp)
{
perror("fopen fp error\n");
return -1;
}
printf("fopen success\n");
int ch = fgetc(fp);
printf("%d\n", ch);
printf("%c\n", ch);
fclose(fp);
return 0;
}
返回值:成功:返回写的字符的ASCII码
失败:EOF
#include
#include
int main(int argc, char const *argv[])
{
char buf[32] = {0};
int a = fgetc(stdin);
fputc(a,stdout);
return 0;
}
功能:判断当前所在位置后面还有没有字符
返回值:成功:后面没有字符会返回一个非0值
失败:后面还有字符会返回0
4.判断是否出错ferror
功能:判断是否出错
返回值:成功:程序出错会返回一个非0值
失败:程序未出错会返回0
例:利用fgetc fputc实现cat命令功能
//1.打开文件
//2.循环读取
//3.输出到终端
//4.关闭文件
#include
int main(int argc, char const *argv[])
{
char ch;
FILE *fp = fopen(argv[1],"r+");
if(NULL == fp)
{
perror("fopen fp error");
return -1;
}
printf("fopen sucess\n");
while(1)
{
ch = fgetc(fp);
if(feof(fp))
break;
fputc(ch,stdout);
}
fclose(fp);
putchar(10);
return 0;
}
读到哪,读多少个,从哪里读
功能:从文件中每次读取一行字符
返回值:成功:存放字符串的地址
失败或读到文件末尾:NULL
功能:向文件中写字符
返回值:成功:非负整数
失败:EOF
#include
#include
int main(int argc, char const *argv[])
{
char ch[32] = {0};
FILE *fp = fopen("1.txt", "r+");
if(NULL == fp)
{
perror("fopen error");
return -1;
}
printf("fopen success\n");
fgets(ch,sizeof(ch),fp);
fputs(ch,stdout);
putchar(10);
fclose(fp);
return 0;
}
例:通过fgets实现 wc -l 文件名 命令功能
#include
#include
int main(int argc, char const *argv[])
{
char buf[32];
int len = 0;
FILE *fp = fopen("1.txt", "r");
if (NULL == fp)
{
perror("fopen error");
return -1;
}
printf("fopen success\n");
while (fgets(buf, 32, fp) != NULL)
{
if (buf[strlen(buf) - 1] == '\n')
len++;
}
printf("%d\n", len);
return 0;
}
功能:从文件流读取多个元素
fread返回值:成功:读取的元素个数
读到文件尾:0 失败:-1
fwrite返回值:成功:写的元素个数
失败 :-1
#include
int main(int argc, char const *argv[])
{
FILE *fp = fopen("1.txt", "w+");
if (NULL == fp)
{
perror("fopen error");
return -1;
}
printf("fopen success\n");
float arr[3] = {1.23, 4.56, 7.89};
float src[3] = {0};
fwrite(arr, sizeof(float), 3, fp);
rewind(fp); //将文件指针定位到开头
fread(src, sizeof(float), 3, fp);
for (int i = 0; i < 3; i++)
printf("%.2f ", src[i]);
putchar(10);
fclose(fp);
return 0;
}
1.rewind
功能:将文件位置指针定位到起始位置
2.fseek
返回值:成功:0
失败-1
int whence参数:
SEEK_SET:定位到起始位置
SEEK_CUR:定位到当前位置
SEEK_END:定位到末尾
3.ftell
功能:获取当前在文件中的位置
返回值:成功:当前在文件中的位置
失败:-1
例:用标准IO实现CP命令
#include
int main(int argc, char const *argv[])
{
char ch[32] = {0};
FILE *fp = fopen("a.txt","r");
if(NULL == fp)
{
perror("fopen fp error");
return -1;
}
printf("fopen fp success\n");
FILE *fp2 = fopen("1.txt","w");
if(NULL == fp2)
{
perror("fopen fp2 error");
return -1;
}
printf("fopen fp2 success\n");
while (1)
{
fgets(ch,32,fp);
fputs(ch,fp2);
if(feof(fp))
break;
}
return 0;
}