标准IO(有缓冲区操作)
1. 标准 IO 是库函数(ANSI C)提供的2.跨平台3. 有缓冲机制4. 文件流(指针)
缓冲区的概念:
缓冲区就是一块内存区,它用在输入输出设备和CPU之间,用来缓存数据。它使得低速的输入输出设备和高速的CPU能够协调工作,避免低速的输入输出设备占用CPU,解放出CPU,使其能够高效率工作。
缓冲区分类:
全缓冲:
缓冲区满或者强制刷新缓冲区以及程序结束(全缓冲的典型代表是对磁盘文件的读写。)
int main(int argc, const char *argv[])
{
printf("I am cxl");
while(1)
{
printf("小黑子");
fflush(stdout);//刷新缓冲区
usleep(2000);//将调用线程至少挂起多少毫秒
}
return 0;
}
行缓冲:
遇到换行符或者强制刷新缓冲区以及程序结束(典型代表是标准输入(stdin)和标准输出(stdout))
int main(int argc, const char *argv[])
{
printf("I am cxl\n");
while(1)
{
}
return 0;
}
不缓冲:
不缓冲(标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来)
int main(int argc, const char *argv[])
{
FILE *pf = NULL;
pf = fopen("1.txt","r");
if (NULL == pf)
{
perror("open file error");//以不缓冲的方式输出
while(1)
{
}
return -1;
}
while(1)
{
}
return 0;
}
打开文件
函数参数1:要打开的文件(可以带路径)
函数参数 2 :打开的模式r : 以只读的方式打开文件,文件存在则打开,不存在则报错r+ : 以读写的方式打开文件,文件存在则打开,不存在则报错w : 以只写的方式打开文件,文件存在则打开,文件不存在则新建w+ : 以读写的方式打开文件,文件存在则打开,文件不存在则新建a : 以追加(只写)的方式打开文件,文件存在则打开,不存在则新建a+ : 以追加(读写)的方式打开文件,文件存在则打开,不存在则新建b : 以二进制的形式函数返回值:成功:打开的文件的文件流指针失败: NULL+ 错误码
关闭文件
函数参数:要关闭的文件流指针
函数返回值:成功返回 0 ,失败返回 -1 和错误信息
int main(int argc, const char *argv[])
{
FILE *pf = NULL;//用来接受fopen函数的返回值
//打开文件
pf = fopen(argv[1],"w");//main函数传参形式打开文件
if (NULL == pf)
{
perror("open file error");
return -1;
}
//操作文件
//关闭文件
fclose(pf);
return 0;
}
操作文件
按字符读写
fgetc
函数参数:想要从中读取字符的文件流指针
函数返回值:读到的内容
模拟cat命令
int main(int argc, const char *argv[])
{
FILE *pf = NULL;//用来接受fopen函数的返回值
//打开文件
pf = fopen(argv[1],"r");
if (NULL == pf)
{
perror("open file error");
return -1;
}
char ch = '0';
//操作文件
while(1)
{
ch = fgetc(pf);
if (EOF == ch)
{
break;
}
printf("%c",ch);
}
//关闭文件
fclose(pf);
return 0;
}
fputc
参数1:要写入的数据
参数 2 :要往哪个文件写
模拟cp命令
int main(int argc, const char *argv[])
{
FILE *pf = NULL;//用来接受fopen函数的返回值
FILE *pw = NULL;
//打开文件
pf = fopen(argv[1],"r");
pw = fopen(argv[2],"w+");
if (NULL == pf && NULL == pw)
{
perror("open file error");
return -1;
}
char ch = '0';
//操作文件
while(1)
{
ch = fgetc(pf);
if (EOF == ch)
{
break;
}
fputc(ch, pw);
}
//关闭文件
fclose(pf);
fclose(pw);
return 0;
}
按行读写
fgets
函数参数1:把内容读到哪里去、
函数参数 2 :读的大小函数参数 3 :从哪个流中读函数返回值:成功内容读到 s 中 失败 NULL
fputs
函数参数1:要写入的字符串
函数参数 2 :要写入的流函数返回值:成功:成功写入的个数,失败: EOF ( -1 )
int main(int argc, const char *argv[])
{
FILE *pf = NULL;//用来接受fopen函数的返回值
FILE *pw = NULL;//用来接受fopen函数的返回值
//打开文件
pf = fopen(argv[1],"r");
pw = fopen(argv[2],"w");
if (NULL == pf && NULL == pw)
{
perror("open file error");
return -1;
}
//操作文件
char buf[20] = {'0'};
int count = 0;
while(1)
{
memset(buf,0,sizeof(buf));
fgets(buf,sizeof(buf),pf);
if(buf[strlen(buf)-1] == '\n' )
{
count++;
}
if(feof(pf))
{
break;
}
fputs(buf,pw);
}
printf("%d\n",count);
//关闭文件
fclose(pf);
fclose(pw);
return 0;
}
按对象读写
fread
函数参数 1 :读到哪函数参数 2 :每一次读多少个函数参数 3 :一共读多少个函数参数 4 :从哪读函数返回值:成功,读到的个数,失败 0
//头文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//相关定义
typedef struct student
{
char name[20];
int age;
float height;
}Stu;
int main(int argc, const char *argv[])
{
FILE *pr = NULL;
//读出
//打开文件
pr = fopen(argv[1],"r");
if(NULL == pr)
{
perror("open file error");
return -1;
}
//操作文件
Stu *stu2 = NULL;
stu2 = (Stu *)malloc(sizeof(Stu));
fread(stu2,1,sizeof(Stu),pr);
printf("name = %s\n",stu2->name);
printf("age = %d\n",stu2->age);
printf("heighr = %ld\n",stu2->height);
//关闭文件
fclose(pr);
return 0;
}
fwrite
函数参数 1 :从哪里写函数参数 2 :每一次写多少函数参数 3 :一共写多少函数参数 4 :写给谁函数返回值:成功:成功写入的个数,失败, 0
#include "mywrite.h"
int main(int argc, const char *argv[])
{
FILE *pw = NULL;
//写入
Stu stu1 = {"zhangsan",18,180.5};
//打开文件
pw = fopen(argv[1],"w");
if(NULL == pw)
{
perror("open file error");
return -1;
}
//操作文件
// fwrite(&stu1,1,sizeof(Stu),pw);
fwrite(&stu1,1,sizeof(Stu),stdin);
//关闭文件
fclose(pw);
return 0;
}
按格式化读写
fprintf
#include <stdio.h>
#include <time.h>
int main(int argc, const char *argv[])
{
FILE *pf = NULL;
time_t tm;
struct tm *ptm = NULL;
time(&tm);
//打开文件
pf = fopen(argv[1],"w");
if (NULL == pf)
{
perror("open file error");
return -1;
}
ptm = localtime(&tm);
fprintf(stdout,"%4d年%2d月%2d日 %2d:%2d:%2d \n",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
fprintf(pf,"%4d年%2d月%2d日 %2d:%2d:%2d \n",ptm->tm_year+1900,ptm->tm_mon+1,ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
fclose(pf);
return -1;
}
fscanf
#include <stdio.h>
#include <stdlib.h>
int main()
{
char str1[10], str2[10], str3[10];
int year = 0;
FILE * fp = NULL;
//打开文件
fp = fopen ("file.txt", "w+");
fputs("We are cxl 2.5", fp);
rewind(fp);//设置文件的开头
//操作文件
fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);
printf(" %s\n", str1 );
printf(" %s\n", str2 );
printf(" %s\n", str3 );
printf(" %d\n", year );
//关闭文件
fclose(fp);
return 0;
}