C语言文件操作(学完自我复习)

C的文件操作及其函数实例

我们会用到如下的函数

涉及到的函数
功能函数名适用范围
字符输入函数fgetc所有输入流
字符输入函数fputc所有输出流
文本行输入函数fgets所有输出流
文本行输出函数fputs说有输入流
格式化输入函数fscanf所有输出流
格式化输出函数fprintf说有输入流
二进制输入fread文件
二进制输出fwrite文件

那么创建一个文件后缀为txt类型的,然后点开你的vs-源文件-添加-现有项-这样就显示了

那么咱们就来写入一个但字符

 

 那么有关FILE的定义如下:

struct _iobuf {
char *_ptr; //指向buffer中第一个未读的字节
int _cnt; //记录剩余的未读字节的个数
char *_base;//文件的缓冲
int _flag;//打开文件的属性
int _file;//获取文件描述
int _charbuf;//单字节的缓冲,即缓冲大小仅为1个字节
int _bufsiz;//记录这个缓冲大小
char *_tmpfname;//临时文件名
};
typedef struct _iobuf FILE;
FILE是一个数据结构,用于访问一个流。每个流都会对应一个FILE结构体。

以及对于一些读和写的操作如下:

“r”:以只读的形式打开文本文件(不存在则出错)
“w”:以只写的形式打开文本文件(若不存在则新建,反之,则从文件起始位置写,覆盖原内容)
“a”:以追加的形式打开文本文件(若不存在,则新建;反之,在原文件后追加)
“r+”:以读写的形式打开文本文件(读时,从头开始;写时,新数据只覆盖所占的空间)
“wb”:以只写的形式打开二进制文件
“rb”:以只读的形式打开二进制文件
“ab”:以追加的形式打开一个二进制文件
“rb+”:以读写的形式打开二进制文件。
“w+”:首先建立一个新文件,进行写操作,然后从头开始读(若文件存在,原内容将全部消失)
“a+”:功能与”a”相同。只是在文件尾部追加数据后,可以从头开始读
“wb+”:功能与”w+”相同。只是在读写时,可以由位置函数设置读和写的起始位置
“ab+”:功能与”a+”相同。只是在文件尾部追加数据之后,可以由位置函数设置开始读的起始位置

以上部分引用: 这个博主的C语言文件读写操作(详解)_放码过来呀!!!的博客-CSDN博客_c语言文件读写

在写入之前要明白文件的流程-打开文件-判断-关闭-清空

打开文件和关闭文件要遵循

  • filename:文件的路径
  • mode:打开模式

那么对于第一个的fputc则遵循:

#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE* pf=fopen("Example.txt", "w");
	if (pf == NULL)
	{
		//文件失败
		printf("%s\n", strerror(errno)); //#include <string.h>和#include <errno.h>对应里边俩
		return 0;
	}
	fputc('A', pf); //写 
	//但是一次只是读一个
	fclose(pf);//值传递
	pf == NULL;
return 0;
}

运行之后你会发现,说明你的文件存储进去了

 对于那个fgetc而言同样遵循:

#include <stdio.h>
#include <errno.h>
#include <string.h>
int main()
{
FILE* pf=fopen("Example.txt", "r");  //读
	if (pf == NULL)
	{
		//文件失败
		printf("%s\n", strerror(errno)); //#include <string.h>和#include <errno.h>对应里边俩
		return 0;
	}
	printf("%c", fgetc(pf)); //输出
	fclose(pf);//值传递
	pf == NULL;
return 0;
}

输出的结果是:

因为上边的俩函数都是单字符输出,所以只能一次得到一个。

然后呢就牵涉到了一个输入输出流,以下三个分别相对应。

 

 代码如下:

//头文件依然是一样,这个也是在main函数中zhixing
int ch = fgetc(stdin); //从标准输入流中来读取信息
	fputc(ch, stdout); //输出 --但是只是单字节的

	FILE* pf = fopen("Example.txt", "w");
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
		return 0;
	}
	fclose(pf);//关闭文件
	pf = NULL;
return 0;

写文件:fputs和那个fgets的要求

的写

FILE* pf = fopen("Example.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//读取成功
	fputs("h", pf); 
	fputs("l", pf);
	fputs("l", pf);
	fclose(pf);//关闭文件
	pf = NULL;
return0 ;

 fgets的读:

char buf[1024] = { 0 };  //读文件
	FILE* pf = fopen("Example.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	fgets(buf, 1024, pf); //读取行 会发生自动换行的现象
	printf("%s", buf); 
//可以替换成puts(buf);
	fclose(pf);//关闭文件
	pf = NULL;

如下 

换一种 

 依旧是fputs,是添加数组的,这样可以输多点的。

char buf[1024] = { 0 };  //读文件
	FILE* pf = fopen("Example.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	fputs("hello\n", pf);
	fputs("god", pf); //将这些东西存到文件中
	fclose(pf);//关闭文件
	pf = NULL;
return 0;

运行如图 

 从键盘上直接的读取


	char buf[1024] = { 0 };
	fgets(buf, 1024, stdin); //标准输入流
	fputs(buf, stdout);//输出标准输出流
***这个和那个gets和puts直接的输出有撒去区别呢,这样不就不经过文件了吗

格式化的形式输入数据 (对照)

 

#include <stdio.h>
#include <string.h>
#include <errno.h>
struct S{

int n;
float score;
char arr[10];
}
int main()
{
struct S s = {32,2.23f,"zhg"}; //第二个是为了区分的是float
	FILE* pf = fopen("Example.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}
	//这个是指写到文件之中  放进去了 
	fprintf(pf,"%d %.2f %s", s.n, s.score, s.arr);
	//
	fclose(pf);
	pf = NULL;
return 0;
}

 运行如图(存入了)

 格式化的写

//上边的和上一个代码一样
struct S s = {0};
	FILE* pf = fopen("Example.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 0;
	}

	fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
    printf("%d %f %s\n", s.n, s.score, s.arr);
	fclose(pf);
	pf = NULL;

return 0;

 输出的形式如下:

 最后的最后

//将结构体俩转化为字符串
	struct S s = { 100,3.16f,"abcd" };
	struct S tmp = { 0 };
	char buf[1024] = { 0 };
	//将格式化的数据转化成字符串储存在buf中
	sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
	//printf("%s\n", buf);
	//从buf中读取格式化的数据到tmp中
	sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
	printf("%d %f %s\n", tmp.n, tmp.score, tmp.arr);

 其实这个复习是写给自己的,里边运用了大量的引用,引用别的博主写的,以及视频上学习的东西,那个b站的学习:c语言编程 C语言入门 c语言(C语言程序设计教程 c语言视频教程 c语言零基础入门教程 学习c语言 c语言视频教程 c语音 C语言教程 C语言编程项目 C语言_哔哩哔哩_bilibili

如果有不对的地方请指正,谢.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

i-阿松!

请给我一毛钱

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

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

打赏作者

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

抵扣说明:

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

余额充值