文件操作————标准IO

标准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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟小刘392

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值