1概念:
在C库中定义的一组用于输入输出的函数
2特点:
1、通过缓冲机制减少系统调用,提高效率
2、围绕流进行操作,流用FILE *表示
3、标准IO模仁打开了三个流,stdin(标准输入) stdout(标准输出) stderr(标准错误)
3缓冲区
1、全缓冲:与文件相关
刷新条件:
程序退出 缓冲区满刷新 强制刷新:fflush
2、行缓冲:与终端相关
刷新条件:
\n 程序退出 缓冲区满刷新 强制刷新:fflush
3、不缓冲:没有缓冲区,标准错误
4函数
day1:fopen fclose fgetc fputc fgets fputs
fread fwrite feof ferror rewind fflush
fopen/fclose:打开/关闭文件
r/rb:只读,当文件不存在时报错,文件流定位到文件开头
r+/r+b:可读可写,当文件不存在时报错,文件流定位到文件开头
w/wb:只写,文件不存在创建,存在清空
w+/w+b:可读可写,文件不存在创建,存在清空
a/ab:追加(在末尾写),文件不存在创建,存在追加,文件流定位到文件末尾
#include<stdio.h>
int main(int argc, char const *argv[])
{
FILE * fp;//创建流
fp=fopen("nihao.txt","w");//有nihao.txt文件打开,没有创建
if(NULL ==fp )
{
perror("fopen error\n");//标准错误
return -1;
}
printf("fopen success\n");
fclose(fp);//关闭nihao.txt文件
return 0;
}
perror:根据错误码输出错误
fputc fgetc 读或者写一个字符
运用其实现cat功能
#include <stdio.h>
int main(int argc, char const *argv[])
{
if(argc !=2)//终端输入不为两个参数时
{
printf("please input %s <filename>",argv[0]);
return -1;
}
FILE *fd;
fd = fopen(argv[1], "r");
if (NULL == fd)
{
perror("fopen error\n");
return -1;
}
//循环读文件
int ch;
//printf("fopen success\n");
while (1)
{
ch = fgetc(fd);
if (feof(fd))//当指针指向结尾的EOF时,相当与EOF==-1
break;
fputc(ch, stdout);
}
fclose(fd);
return 0;
}
fgets fputse:按行读或者写字符串
#include<stdio.h>
int main(int argc, char const *argv[])
{
FILE * fp=fopen("hello.txt","r+");
if(fp==NULL)
{
printf("fopen error\n");
return -1;
}
char buf[32];
fgets(buf,32,stdin);//从终端输入数组
printf("buf:%s",buf);
fputs(buf,stdout);//从数组输出到终端
return 0;
}
fwrite :二进制读写 从文件流写入fread:从文件流读出数据
#include <stdio.h>
int main(int argc, char const *argv[])
{
FILE *fg = fopen("hello.txt", "w+");
if (NULL == fg)
{
perror("fg error\n");
return -1;
}
float arr[3] = {1.1, 2.2, 3.3};
fwrite(arr, sizeof(float), 3, fg);//二进制读入文件
rewind(fg);//文件指针回到文件开始位置
float new[3] = {0};
fread(new, sizeof(float), 3, fg);//从文件读出数据
printf("%.2f %.2f %.2f\n",new[0],new[1],new[2]);
return 0;
}
用fputs实现cat功能
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
if (argc != 2) //终端输入不为两个参数时
{
printf("please input %s <filename>\n", argv[0]);
return -1;
}
FILE *fp;
//打开文件
fp = fopen(argv[1], "r");
if (NULL == fp)
{
perror("fopen error\n");
return -1;
}
int len = 0;
char buf[32] = {0};
while (fgets(buf, 32, fp) != NULL) //fgets读到结尾返回NULL
{
if (buf[strlen(buf) - 1] == '\n')//读完32个后最后是‘\0’,判断前一个是否是‘\n’
len++;
}
printf("%d %s\n", len, argv[1]);
fclose(fp);
return 0;
}
用fread fwrite实现cp
#include <stdio.h>
#include <string.h>
int main(int argc, char const *argv[])
{
char buf[32] = {0};
ssize_t s = 0;//无符号char类型
if (argc != 3)
{
printf("please input %s <srcfile> <destfile>", argv[0]);
return -1;
}
//打开两个文件
FILE *yuan = fopen(argv[1], "r");
if (NULL == yuan)
{
perror("yuan error\n");
return -1;
}
FILE *biao = fopen(argv[2], "w");
if (NULL == biao)
{
perror("biao error\n");
return -1;
}
//用s接受目的是防止最后不到32个如12asf,时候传进去会12asfnih
while ((s = fread(buf, 1, 32, yuan)) != 0)
{
fwrite(buf, 1, s, biao);
}
fclose(yuan);
fclose(biao);
return 0;
}
fseek和ftell
#include<stdio.h>
int main(int argc, char const *argv[])
{
FILE * fp=fopen("hello.txt","w+");
if(NULL==fp)
{
perror("fopen hello.txt error");
return -1;
}
fputs("hello world",fp);
//指针指向开头那么便在第一个字符前面位置
//指针指向最后那么便在最后一个字符前面位置
fseek(fp,-2,SEEK_END);//指针相对对后前移两个指向l
printf("%ld\n",ftell(fp));//返回当前指针位置,
fputc('a',fp);//将l改为a
fseek(fp,2,SEEK_SET);//指针相对对开头前移两个指向l
printf("%ld\n",ftell(fp));//返回当前指针位置,
printf("%c\n",fgetc(fp));
fclose(fp);
return 0;
}
freopen:将其流重定向到目标文件
#include<stdio.h>
int main(int argc, char const *argv[])
{
FILE *fp;
fp = freopen("hello.txt","w+",stdout);//将终端重定向到hello.txt
if(NULL == fp)
{
perror("freopen err");
return -1;
}
printf("world\n");//向hello.txt输入world
freopen("/dev/tty","r+",stdout);//将终端重新定向回来,其终端在/dev/tty下
return 0;
}
rewind:将其文件指针定位到开头
今天的文章标准IO知识梳理_iso有多少个标准分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/62039.html