c语言文件操作


文件应用,写日志

文件

数据文件和程序文件
在这里插入图片描述
程序文件可以向数据文件中读写

文件名

在这里插入图片描述

文本的存储形式

文本文件 和二进制文件
区别:内存向外部显示时,
转化成ASCII的字符的是文本文件,按字符显示,能读懂文件内容,一般有几个数字就占几个字节。
不转化的是,二进制文件,一般按内存安排字节。
例:
int a = 10000;
按文本文件存储占5个字节(当成5个字符),
按二进制存储占4字节 (10 27 00 00)

文件缓冲区

在这里插入图片描述

装数据,用于内存向磁盘输出数据先放到内存中的缓冲区,堆满再一块送到磁盘:或者从磁盘读取数据时先放到缓冲区,再逐个的将数据送到程序数据区
全缓冲,行缓冲,无缓冲

文件指针

缓冲文件系统会为每一个文件系统开辟一个文件信息区,包含在<stdio.h>头文件中,被定义为FILE类型数据。
包含在<stdio.h>头文件中,被定义为FILE类型数据
编写数据文件时,需要定义一个指向该结构体类型的指针。例:FILE *fp;
在这里插入图片描述

fp是一个指向FILE类型结构体的指针变量,
可以通过 fp指向一个文件类型的指针,从而通过该结构体变量中的文件信息访问文件

文件的打开与关闭

参考:c语言文件操作

fopen:打开文件,返回文件指针
fclose:关闭文件

#include<stdio.h>
int main()
{
	int a = 10000;//按文本文件存储占5个字节,按二进制存储占4字节
	FILE* pf = fopen("test.txt","wb");//对文件进行创建fopen和写入fwrite
	fwrite(&a,4,1,pf);//写入a地址,4字节,1个数,放到pf维护的数据中去,
	fclose(pf);//关闭文件
	pf = NULL;
	return 0;
}

打开方式:
在这里插入图片描述
绝对路径:明确的写出其路径。
注意 \ 会被转义,例如 \t 会被转义,可变成 \ 再转义一次, 避免转义
相对路径:
… 表示上一路径
. 表示当前路径
FILE *pf = fopen(“…\test.txt”,“r”);
指针 pf 指向 FILE 这个结构变量 ,该结构体变量维护文件;
若打开失败,则pf指向空指针
判断利用strerror(errno)

打开&关闭

#include<stdio.h>
#inlcude<string.h>
#include<errno.h>  //注意头文件
int main() {

	FILE *pf = fopen("test.txt","r");//只读
	if(pf == NULL) {            //判断指针1是否指向空
		printf("%s\n",strerror(errno));//报错
		return 0;
	}  
	
	fclose(pf);
	pf = NULL;
	
	return 0;
}

注意文档需要和该程序放同一路径。
若对已有的文档进行写,会清空该文档,新建文件,造成覆盖写

文件的顺序读写*

在这里插入图片描述

字符输入输出:fgetc(),fputc()

写:fputc(‘G’,pfWrite);写入文件或打印到屏幕上

FILE* pfWrite = fopen("test.txt","w"); //向文件写入
	if(pfWrite == NULL) {
		printf("%s\n",strerror(errno));
		return 0;
	}
	fputc('G',pfWrite);
	fputc('Y',pfWrite);
	fputc('P',pfWrite);  //写入
	
	fclose(pfWrite);     //关闭文件
	pfWrite = NULL;

读:fgetc(),可以读文件,或向屏幕上写

FILE* pfRead = fopen("test.txt","r");
	if(pfRead == NULL) {
		printf("%s\n",strerror(errno));
		return 0;
	}
	
	printf("%c",fgetc(pfRead));
	printf("%c",fgetc(pfRead));
	printf("%c",fgetc(pfRead));//形式1
		//读文件1.fgetc
//	int ch = fgetc(pf);//"r"
//	printf("%c",ch);
//	ch = fgetc(pf);
//	printf("%c",ch);//形式2 

	fclose(pfRead);
	pfRead = NULL;

键盘(标准输入),屏幕(标准输出)(程序默认的流设备)都是外设,可以通过读 或写 ,到外设
程序默认打开的流设备(键盘和屏幕)
默认打开:
stdin FILE*,标准输入流
stdout FILE*, 标准输出
stderr FILE*,
引用:

int main() {
	int ch = fgetc(stdin);//键盘输入
	fputc(ch,stdout);     //输出屏幕
	return 0;
} 

只能打印一个字符。

文本输入输出:fgets(),fputs()

写:fputs( )

int main()
{
	FILE* pf = fopen("test.txt", "w");//打开文件 
	//判断打开是否会失败
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
	}
	
	//写文件2.
	fputs("hello\n",pf);//fputs没有换行 
	fputs("world\n",pf); 
	fclose(pf);
	pf = NULL;
		return 0;
}

读:fgets( )

int main()
{
	 FILE* pf = fopen("test.txt", "r");//打开文件 
	//判断打开是否会失败
	if (pf == NULL) {
		printf("%s\n", strerror(errno));
	}
	 char buf[1024] = { 0 };
	 fgets(buf,1024,pf);
//	 printf("%s",buf);//1.buf存储了换行 打印gyp\n(换行) 
	 puts(buf);//2.自身存在换行 //gyp\n\n 
	 
	 fgets(buf,1024,pf);
//	 printf("%s",buf); //打印hello\n
	 puts(buf);
	 fclose(pf);
	pf = NULL;
		return 0;
}
标准输入输出流:读取或输出一行:
int main()
{
	char buf[1024] = { 0 }; 
	fgets(buf,1024,stdin);//从标准输入流读取 
	fputs(buf,stdout);//输出到标准输出流 
	//等价于
	//	gets(buf);
	//	puts(buf);
	return 0;
}
格式化的输入输出:fscanf(),fprintf()

sprintf写“w”
可以针对标准输出流或者指定文件流

struct S {
	int n;
	float score;
	char arr[10];
};

int main() {
	struct S s = { 100, 3.14f, "gyp"};
	FILE* pf = fopen("test.txt", "w");
	if(pf == NULL) {
		return 0;
	}
	//格式化形式写文件
	fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
	
	fclose(pf);
	pf = NULL;
	return 0;
}

**fscanf()**读 “r”

	struct S s = { 0 };
	FILE* pf = fopen("test.txt", "r");
	if(pf == NULL) {
		return 0;
	}
	fscanf(pf, "%d %f %s", &(s.n), &(s.score), &(s.arr));
	printf("%d %f %s",s.n, s.score, s.arr);
//printf这里是读取到屏幕

从键盘屏幕输入输出:

struct S {
	int n;
	float score;
	char arr[10];
};

int main() {
	struct S s = { 0 };
	fscanf(stdin, "%d %f %s", &(s.n), &(s.score), &(s.arr));
	fprintf(stdout, "%d %f %s", s.n, s.score, s.arr); 
	return 0;
}

scanf printf 与 fscanf fprintf 与 sscanf sprintf区别
在这里插入图片描述

sscanf()读,sprintf()写到字符串中去

sprintf(),把字符串的数据转化为字符串存储到buf
sscanf(),从buf中读取格式化数据到tmp中

struct S {
	int n;
	float score;
	char arr[10];
};
int main() {
	struct S s = { 100, 3.14f, "abcdef"};
	struct S tmp = { 0 };
	char buf[1024] = { 0 };
	
	sprintf(buf, "%d %.2f %s", s.n, s.score, s.arr);
	printf("%s\n",buf);

	sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), &(tmp.arr));
	printf("%d %f %s\n",tmp.n, tmp.score, tmp.arr);
	return 0;
}
二进制的输入与输出
读:fread,写:fwrite

1.写“wb”,注意是二进制

struct S {
	char name[20];
	int age;
	double score;
};

int main() {
	struct S s = {"张三", 20, 55.6};
	FILE *pf  = fopen("test.txt", "wb");
	if(pf == NULL) {
		return 0;
	}
	//二进制形式写文件
	fwrite(&s, sizeof(struct S), 1, pf);
		//在pf中读1个大小为size的 数据放到s中去 
	fclose(pf);
	pf = NULL; 
	return 0;
}

2.读“rb” fread

int main() {
//	struct S s = {"张三", 20, 55.6};
	struct S tmp = { 0 };
	FILE *pf  = fopen("test.txt", "rb");
	if(pf == NULL) {
		return 0;
	}
	//二进制形式写文件
	fread(&tmp, sizeof(struct S), 1, pf);
	//在pf中读1个大小为size的 数据放到tmp中去 
	printf("%s %d %lf\n",tmp.name, tmp.age, tmp.score);
	fclose(pf);
	pf = NULL; 
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值