Day 30 文件

文件

存储在内存储器的集合,一般称为表,如数组;而存储在外部介质上的信息集合称为文件,如磁盘文件。

文件通常是驻留在外部介质(如磁盘等)上的,使用时才调入内存。

文件缓冲方式

1.行缓冲

标准库函数向标准输出屏幕输出东西时候是行缓冲
所谓的行缓冲就是缓冲区碰到换行符的时候刷新缓冲区
如果不刷新缓冲区,无法对文件进行读写操作
fflush(stdout);清除缓冲区

2.全缓冲

标准库函数往普通文件读取的数据的是全缓冲的,碰到换行符也不刷新缓冲区,缓冲区满了才刷新缓冲区
刷新缓冲区的情况,
    a.缓冲区满了,刷新缓冲区
    b.人为刷新缓冲区,用fflush
    c.程序正常结束,会刷新缓冲区

3.无缓冲

在读写文件的时候,通过系统调用io,对文件进行读写数据,这个时候是无缓冲,数据会立马进入文件,读数据会立马进入内存

写文件的流程

应用程序空间,内核空间,驱动程序,硬盘上
应用程序和内核程序运行在不同的空间里,目的是为了保护内核

设置缓冲区的目的
通过缓冲可以减少进出内核的次数,提高效率

文件可分为文本文件和二进制文件
文本文件
基于字符编码,常见有ASCII,UNICODE。
二进制文件
基于值编码,
需要自己判断或使用特定软件分析数据格式

文件指针

  • 文件缓冲区:每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态以及文件当前的位置),这些信息是保存在一个结构体变量之中  这个结构体变量叫 FIEL
  • 文件指针:在C语言中用一个指针变量指向一个文件,通过文件指针就可以对它所指的文件进行各种操作。
  • 一般通过一个FILE的指针来维护这个FILE结构的变量

  • 文件指针定义的一般格式:FILE 文件指针

其中:FILE是文件缓冲区的类型名,必须大写;“文件指针”是指向文件缓冲区的指针

例如:

FILE* pf;//文件指针变量

三个特殊的文件指针

stdin 标准输入(键盘)
stdout 标准输出(屏幕)
stderr 标准出错(屏幕)
perror,程序出错时,会提示出现了什么问题

打开文件fopen

打开一个已经存在的文件并返回这个文件的文件指针,或者创建一个文件,并打开此文件,然后返回文件的标识示

FILE * fopen ( const char * filename, const char * mode );

文件模式:
“ r ”(只读)    为了输入数据,打开一个已经存在的文本文件    出错
“ w ”(只写)    为了输入数据,打开一个文本文件    建立一个新的文件
“ a ”(追加)    向文本文件尾添加数据    建立一个新的文件
“ r+ ”(读写)    为了读和写,打开一个文本文件    出错
“ w+ ”(读写)    为了读和写,建立一个新的文件    建立一个新的文件
“ a+ ”(读写)    打开一个文件,在文件尾进行读写    建立一个新的文件
“ rb ”(只读)    为了输入数据,打开一个二进制文件    出错
“ wb ”(只写)    为了输入数据,打开一个二进制文件    建立一个新的文件
“ ab ”(追加)    向一个二进制文件尾添加数据    出错
“ rb+ ”(读写)    为了读和写,打开一个二进制文件    出错
“ wb+ ”(读写)    为了读和写,建立一个新的二进制文件    建立一个新的文件
“ ab+ ”(读写)    打开一个二进制文件,在文件尾进行读写    建立一个新的文件
 

关闭文件fclose

int fclose(p);
这个文件只能关闭一次

读写文件

一次读写一个字符

int fgetc(p);
从文件指针所标识的文件中读取一个字节,将字节值返回
int fputc(int ,p)

一次读写一个字符串

char str[]
fgets(str,int size,fp);

char str[100];
	char *pstr; 
	while((pstr = fgets(str, 100, fp)) != NULL)
	{
		printf("%s", pstr);
	}


fputs(str,fp)

读文件fread

char *p
fread(pstr,块大小,几块,fp)

#include<string.h>
#include<stdio.h>

int main()
{
	FILE *fp = fopen("./1.txt", "r");
	if(fp == NULL)
	{
		printf("open failed\n");
	}
	
	char str[100];
	fread(str, 10, 10, fp);
	printf("%s\n", str);
	
	fclose(fp);
	
	
	return 0;
}

写文件write

fwrite(pstr,块大小,几块,fp)

#include<string.h>
#include<stdio.h>

int main()
{
	FILE *fp = fopen("./1.txt", "a+");
	
	if(fp == NULL)
	{
		printf("open failed\n");
	}
	char str[100] = "秋刀鱼的滋味,猫跟你都想了解~";
	fwrite(str, 10, 10, fp);
	rewind(fp);
	fread(str, 10, 10, fp);
	printf("%s", str);
	
	fclose(fp);
	
	return 0;
}

移动光标(将光标移到文件开头)

rewind(fp)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值