文件操作

1. 为什么使用文件
2. 什么是文件
3. 文件的打开和关闭
4. 文件的顺序读写
5. 文件的随机读写
6. 文本文件和二进制文件
7. 文件读取结束的判定
8. 文件缓冲区

一、为什么使用文件?

在程序中我们开辟的空间都是在栈上、堆上或者静态区中,这些都是内存中数据,在程序结束后,数据就销毁了。

从而我们的电脑需要一种长久性储存数据的能力,也就是文件,它保存在电脑的硬盘中。

二、什么是文件?

计算机文件(或称文件电脑档案档案),是存储在某种长期储存设备上的一段数据流。所谓"长期储存设备"一般指磁盘光盘磁带等。其特点是所存信息可以长期、多次使用,不会因为断电而消失。

一般来说文件分为两种,一种是程序文件,一种是数据文件。

程序文件就是在平时写程序中产生的一系列文件,如源文件(以.c为后缀),编译生成的目标文件(以.obj为后缀)和链接生成的可执行文件(以.exe为后缀)。

数据文件就是在程序运行中可从中改写或读取数据的文件。

那我们如何标识一个文件呢?就像是一个人需要名字一样,文件也有文件名。

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含 3 部分:文件路径 + 文件名主干 + 文件后缀
例如: c:\code\test.txt

三、文件的打开和关闭

在c语言程序中如何进行文件的打开和关闭呢?先来了解下面几个概念:

1、文件信息区

它是一个结构体类型的变量,当程序对文件进行操作的时候,就会在内存中为文件开辟一个文件信息区,其中存放了文件的信息

它需要FILE*类型的指针来对它进行维护,这个指针称为文件指针。在VS2013下我们可以看到这个结构体的成员列表,

struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
};
typedef struct _iobuf FILE;

打开一个文件需要用到fopen函数,在msdn中可以看到它的参数情况。

 它的返回值是一个FILE*类型的指针,指向了文件信息区。第一个参数是要打开的文件的文件名,第二个参数是文件的打开方式。

一个文件的打开方式有:“r”只读,“w”只写,“a”追加数据,“wb”以二进制的方式写,“rb”以二进制的方式读,等等。

注意:如果以读的方式打开文件,文件不存在时会报错,而以写的方式打开文件,如果文件不存在,系统会自动创建一个文件。

下面给出打开一个文件的具体代码:

#include<stdio.h>
int main()
{    
     FILE* pf1 = fopen("test.txt","r");//以读的方式打开文件
     FILE* pf2 = fopen("test.txt","w");//以写的方式打开文件
     FILE* pf3 = fopen("test.txt","a");//以追加数据的方式打开文件
     return 0;
}

关闭文件时用到的是fclose函数,只要将文件指针传给它就可以,但是要注意,一定要将指针置为NULL,这一点和动态开辟空间很像。

#include<stdio.h>
int main()
{
    FILE* pf = fopen("test.txt","r");
    fclose(pf);
    pf = NULL;//文件指针一定要置空
    return 0;

}

三、文件的顺序读写

功能                     函数名            适用范围

字符输入函数          fgetc          所有输入流
字符输出函数          fputc          所有输出流
文本行输入函数       fgets         所有输入流
文本行输出函数       fputs         所有输出流
格式化输入函数      fscanf       所有输入流
格式化输出函数      fprintf        所有输出流
二进制输入              fread            文件
二进制输出              fwrite            文件

 文件的顺序读写就是适用上面展示的这些函数,对文件进行读取数据或者写入某些数据。

1.fgetc

 它的功能是在文件中读取字符,如果调用成功就会返回读取字符的ASCII码值,失败则返回EOF。

首先我们创建一个hello world.txt的文本文件,在里面写入一点内容,然后调用一下fgetc函数

#include<stdio.h>
int main()
{
	FILE* pf = fopen("hello world.txt", "r");//以读的方式打开我们已经创建好的文件
	char ch = fgetc(pf);//得到字符
    printf("%c",ch);
	fclose(pf);//关闭文件
	pf = NULL;//指针置空
	return 0;
}

打印的结果,成功读取字符h。 

 

 2.fputc

它的作用是往文件中输入一个字符。

第一参数是要输入字符的ASCII码值,实际上直接输入这个字符也是可行的,第二个参数是这个文件的文件指针。

现在我们把刚刚的hello world删除,输入一个字符a。

 #include<stdio.h>
int main()
{
    FILE* pf = fopen("hello world.txt", "w");
    fputc(97,pf);//直接输入ASCII码值
    fclose(pf);
    pf = NULL;
    return 0;
}

 

#include<stdio.h>
int main()
{
    FILE* pf = fopen("hello world.txt", "w");
    fputc(‘a’,pf);//直接输入字符
    fclose(pf);
    pf = NULL;
    return 0;
}

 

 

 参数返回,它是字符的ASCII码值。

 3.fgets

它从文件中读取字符串。

第一个参数是存放字符串的位置,第二个参数是最多要读取多少个字符,第三个参数是文件指针,由于它针对所有的流,所以实际上也可以从缓冲区中得到字符串,这时第三个参数要传stdin。 

#include<stdio.h>
int main()
{
	FILE* pf = fopen("hello world.txt", "r");
	char arr[6] = { 0 };//存放字符串
	fgets(arr,6,pf);//读取文件
	printf("%s", arr);//打印结果
	fclose(pf);
	pf = NULL;
	return 0;
}

 

4.fputs

 类似的,它是往文件中输入一个字符串

 第一个参数是字符串,第二个参数是文件指针。

#include<stdio.h>
int main()
{
	FILE* pf = fopen("hello world.txt", "w");
	fputs("hello world", pf);//在文件中输入hello world
	fclose(pf);
	pf = NULL;
	return 0;
}

结果

 本章剩下的内容将放在下一篇博客中,敬请期待。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值