什么是文件操作?为什么要有文件操作?


前言

文件,我们学习C最后都要与实体进行交互,面向端往往取决于需求,而之前好像一直在写一些仅仅给自己看的小逻辑,并没有完全可以保存下来,比如保存成电脑中文件的样子的文件。
本章主要介绍如何去与自己的计算机进行交互,前几天发布的通讯录并没有记忆功能,每次运行都需要重新输入数据,然后去进行删除、显示、查看等等的操作,本章介绍的就是如果将这些内容保存到自己的电脑中,创建出一个文件

一、什么是文件

  • 一般在程序中我们将文件分为两种:程序文件、数据文件。

1.1 程序文件

  • 源程序文件,后缀为.c

打开可以直接进入编译器
在这里插入图片描述

  • 目标文件,在windows上后缀为.obj

这是在我们windows下的文件
在这里插入图片描述

  • 可执行程序,windows下后缀为exe

在这里插入图片描述

1.2 数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件

这也是本文主要探讨的文件。

二、文件的打开与关闭

2.1 文件指针

一般这种都是在库函数中有声明的,在我所用的vs2013版本里声明在 #include<stdio.h>
一般这类结构体变量都取名为 FILE

2.2 文件的打开与关闭

文件在读写之前先需要打开文件,用完之后要手动关闭文件
例:

//打开文件
FILE * fopen ( const char * filename, const char * mode );
//关闭文件
//打开文件与关闭文件必须成对出现
int fclose ( FILE * stream );

2.3 文件读写详情表!(重点)

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

新建文件演示

//引用库函数
#include<stdio.h>
int main()
{
	FILE* pfw;
	//建立一个新的文件,之前并不存在的文件
	pfw=fopen("text.txt","w");
	//查看是否开辟成功
	if(pfw==NULL{
		perror("fopen example::text.txt");
		teturn;
	}
	//关闭文件
	fclose(pfw);
	return 0;
}

2.4 文件的顺序读写!(重点)

功能函数名适用于
字符输入函数fgets所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

选择自己所需要的输出输入格式
实机演示

//之前的通讯录中实现信息的存储
void loadContact(struct Contact* pc)
{
	//查pc
	assert(pc);
	//开辟文件,并准备写入数据
	FILE* pfw = fopen("data.txt", "rb");
	if (pfw == NULL)
	{
		perror("Contact.loadContact::fopen");
		return;
	}
	int i = 0;
	//依次写入通讯录中每组数据
	for (i = 0; i <= pc->sz; i++)
	{
		fread(pc->data + i, sizeof(struct strtact), i, pfw);
	}
	//关闭文件
	fclose(pfw);
	pfw = NULL;
}

2.5 文件的随机读写

2.5.1 fseek

根据文件指针的位置和偏移量来定位文件指针
fseek

int fseek ( FILE * stream, long int offset, int origin );

**

int main ()
{
  FILE * pfw;
  pfw = fopen ( "text.txt" , "wb" );
  fputs ( "This is an apple." , pfw );
  fseek ( pfw , 3 , SEEK_SET );
  fputs ( " sam" , pfw );
  fclose ( pfw );
  return 0;
}

2.5.2 ftell

指定读取文件指针时相对于起始位置的偏移量

long int ftell(FILE* stream);

#include <stdio.h>
int main ()
{
  FILE * pFile;
  long size;
  //打开文件
  pFile = fopen ("myfile.txt","rb");
  if (pFile==NULL)
  perror ("Error opening file");
  else
 {
 	//读取文件
    fseek (pFile, 0, SEEK_END);
    size=ftell (pFile);
    //关闭文件
    fclose (pFile);
    printf ("Size of myfile.txt: %ld bytes.\n",size);
 }
  return 0;
}

2.6 文本文件与二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。
一个数据在内存中是怎么存储的呢?
字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

存入的文本文件
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值