什么是文件操作?为什么要有文件操作?
文章目录
- 前言
- 一、什么是文件
- 1.1 程序文件
- 1.2 数据文件
- 二、文件的打开与关闭
- 2.1 文件指针
- 2.2 文件的打开与关闭
- 2.3 文件读写详情表!(重点)
- 2.4 文件的顺序读写!(重点)
- 2.5 文件的随机读写
- 2.5.1 fseek
- 2.5.2 ftell
- 2.6 文本文件与二进制文件
前言
文件,我们学习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测试)。
存入的文本文件
qq_43499814: 你说得对
星河栀染: 挖坑法代码,是不是有一处写错了,找到左侧大于基准值的,不应该是往右坑位填入v[hole]=v[left],key不应该是基准值吗
观山海.: 是的,不过只是萌新一枚
木子斤欠木同: 是不是比特的师兄
一朵猫猫菇: 位图