C语言—文件基础

文件概述

文件的定义

所谓文件一般指存储在外部介质(如磁盘磁带)上数据的集合.

操作系统是以文件为单位对数据进行管理的.

文件的分类

①从操作系统的角度看,每一个与主机相连的输入输出设备看作是一个文件。
例:输入文件:终端键盘
输出文件:显示屏和打印机

②从用户观点:
特殊文件(标准输入输出文件或标准设备文件)
普通文件(磁盘文件)

③按数据的组织形式:
ASCII文件(文本文件):每一个字节放一个ASCII代码二进制文件:把内存中的数据按其在内存中的存储形式原样输出到磁盘上存放.
例:整数10000在内存中的存储形式以及分别按ASCII码形式和二进制形式输出如下图所示:
在这里插入图片描述

ASCII文件和二进制文件的比较:
1、ASCII文件便于对字符进行逐个处理,也便于输出字符。但一般占存储空间较多,而且要花费转换时间。
2、二进制文件可以节省外存空间和转换时间,但一个字节并不对应一个字符,不能直接输出字符形式。
3、一般中间结果数据需要暂时保存在外存上,以后又需要输入内存的,常用二进制文件保存。

④文件的处理方法:
缓冲文件系统:系统自动地在内存区为每一个正在使用的文件开辟一个缓冲区。用缓冲文件系统进行的输入输出又称为高级磁盘输入输出。

非缓冲文件系统:系统不自动开辟确定大小的缓冲区,而由程序为每个文件设定缓冲区。用非缓冲文件系统进行的输入输出又称为低级输入输出系统。
在这里插入图片描述

文件类型指针

在缓冲文件系统中,每个被使用的文件都要在内存中开辟一FILE类型的区,存放文件的有关信息。stdio.h 中定义了一个称为 FILE 的结构.

文件指针所需的唯一声明为:FILE *fp;
文件指针指向一个结构,该结构包含以下信息:文件名、文件的当前位置、文件是否正在读或写、是否出错或是否到达文件末尾

文件缓冲区示意图:
在这里插入图片描述
文件操作基本流程:
在这里插入图片描述

文件函数

分类函数名功能
打开文件fopen()打开文件
关闭文件fclose()关闭文件
文件定位fseek()改变文件位置指针的位置
Rewind()使文件位置指针重新至于文件开头
Ftell()返回文件位置指针的当前值
文件状态feof()若到文件末尾,函数值为真
ferror()若对文件操作出错,函数值为真
clearerr()使ferror和feof()函数值置零
文件读写         fgetc(),getc()从指定文件取得一个字符          
                fputc(),putc()把字符输出到指定文件
                fgets()从指定文件读取字符串
                fputs()把字符串输出到指定文件
                getw()从指定文件读取一个字(int型)
                putw()把一个字输出到指定文件
                fread()从指定文件中读取数据项
                fwrite()把数据项写到指定文件中
                fscanf()从指定文件按格式输入数据
                fprintf()按指定格式将数据写到指定文件中

文件的打开(fopen函数)

函数调用:

FILE  *fp;
fp=fopen(文件名,使用文件方式);

①需要打开的文件名,也就是准备访问的文件的名字;
②使用文件的方式(“读”还是“写”等);
③让哪一个指针变量指向被打开的文件。

文件的打开与关闭:
“r” (只读)为输入,打开一个文本文件
“w” (只写)为输出,打开一个文本文件
“a” (追加)向文本,文件尾增加数据
“rb” (只读)为输入,打开一个二进制文件
“wb” (只写)为输出,打开一个二进制文件
"ab“ (追加)向二进制文件尾增加数据
"r+“ (读写)为读/写打开一个文本文件
"w+” (读写)为读/写建立一个新的文本文件
“a+” (读写)为读/写打开一个文本文件(追加)
"rb+“ (读写)为读/写打开一个二进制文件
“wb+“ (读写)为读/写建立一个新的二进制文件
“ab+” (读写)为读/写打开一个二进制文件

“r+” 与"w+"两种方式打开的区别?
当第一次打开一个文件时,文件不存在,则需要对文件进行创建(程序创建,不是人工手动创建),如果用r+这种模式open的话会返回失败,如果用w+,当第二次打开这个文件时就会重新创建一个新的文件,那么原来文件里的数据就会丢失。

文件的关闭(fclose函数)

函数调用:
fclose(文件指针);
函数功能:
使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作
返回值:
关闭成功返回值为0;否则返回EOF(-1)

当前活动指针(ftell 函数)

FILE 结构提供了一个指针,用以跟踪发生 I/O 操作的位置,每当从流中读取或写入一个字符,当前活动指针(即 curp)就会向前移动,当前活动指针的当前位置可以借助 ftell() 函数来获得。

函数原型:long int ftell(FILE *fp);
返回值:成功时返回文件指针位置,否则返回-1

rewind()函数

功能说明:将文件位置指示器置于文件开头相当于reset(重置)文件指针

函数原型:void rewind(FILE * fp) ;

设置当前位置(fseek 函数)

功能说明:通过指定相对于开始位置、当前位置或流的末尾位置的字节数来重定位 curp,这取决于 fseek() 函数中指定的位置

函数原型:int fseek (FILE *fp, long int offset, int origin);
参数:
fp:需设置的文件指针
offset:偏移量
origin:搜索的起始位置
返回值:无

origin 表示搜索的起始位置,有以下几个值:
SEEK_CUR 或 1 :当前文件指针的位置
SEEK_END 或 2 :文件末尾
SEEK_SET 或 0 :文件开始

fseek和ftell的综合应用,示例:

int main()
{
	FILE *fp;
	int nLength = 0;
	fp =fopen(1.txt”,”r+);
	if(fp == NULL)
	{
		printf(“open failed\n”);
		return -1;
	}
	fseek(fp,0,SEEK_END);//偏移到文件尾部
	nLength = ftell(fp);//获取当前文件指针离文件开头的字节数
	printf(“the file length is %d\n”, nLength);
	fclose(fp);
}

字符输入输出函数(fputc()和fgetc())

1、fputc()函数

函数调用:int fputc(int ch,FILE *fp) ;
函数功能:
将字符(ch的值)输出到fp所指向的文件中去。
返回值:
如果输出成功,则返回值就是输出的字符;
如果输出失败,则返回一个EOF.

2、fgetc()函数

函数调用:int fgetc(FILE *fp)
函数功能:
从指定的文件读入一个字符,该文件必须是以读或读写方式打开的。
返回值:
读取成功一个字符,赋给ch。如果遇到文件结束符,返回一个文件结束标志
EOF 。

常见的读取字符操作:

①从一个文本文件顺序读入字符并在屏幕上显示出来:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	FILE *fp;
	char ch;
    char string[ ] = "This is a test";
	fp = fopen("1.txt","w+");
    fwrite(string, strlen(string), 1, fp);  //将string写入文件
	fseek(fp, 0, SEEK_SET);  //将文件指针设到起始位置
	ch = fgetc(fp);
	while(ch != EOF)
	{
		 putchar(ch);
		 ch = fgetc(fp);
	} 
	return 0;
}

注意:EOF不是可输出字符,因此不能在屏幕上显示。由于字符的ASCII码不可能出现-1,因此EOF定义为-1是合适的。当读入的字符值等于-1时,表示读入的已不是正常的字符而是文件结束符。

②从一个二进制文件顺序读入字符:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
	FILE *fp;
	char ch;
    char string[ ] = "This is a test";
	fp = fopen("1.dat","w+");
    fwrite(string, strlen(string), 1, fp);
	fseek(fp, 0, SEEK_SET);

	while(!feof(fp))  //判断文件不是真的结束,循环
	{
        ch = fgetc(fp);
		putchar(ch);
	} 
	return 0;
}

注意:ANSI C提供一个feof()函数来判断文件是否真的结束。如果是文件结束,函数feof(fp)的值为1(真);否则为0(假)。以上也适用于文本文件的读取。

fwrite()函数

功能说明:fwrite是无格式写函数,用于向文件写入整块的数据。最有价值的一个应用就是读写用户定义的数据类型,尤其是结构。

函数原型:size_t fwrite(const void *buffer,size_t bytes, sizeo_t n,FILE *fp);
参数:buffer:要写入数据的首地址
bytes:一个单元占字节数
n:写入几个单元
fp:操作的文件指针
返回值:成功时返回写入的单元数,否则返回0

fread()函数

功能说明:fread是无格式读函数,用于向文件读出整块的数据。经常用fwrite函数写入,读取时用fread函数

函数原型:size_t fread(void *buffer, size_t bytes, sizeo_t n, FILE *fp);
参数:buffer:接收缓冲区的首地址
bytes:一个单元占字节数
n:读出几个单元
fp:操作的文件指针
返回值:成功时返回读出的单元数,否则返回0

fread与fwrite实例:

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

int main()
{
	FILE *fp;
	char ch;
    char string[1024] = "This is a test";
	char rdata[1024];
	fp = fopen("1.txt","w+");
    fwrite(string, sizeof(string), 1, fp);
	fseek(fp, 0, SEEK_SET);

	fread(rdata,sizeof(rdata),1,fp);  //这里fread的sizeof的大小和fwrite的一直,不然会打印结果后出现乱码或显示不全
	printf("rdata = %s\n",rdata);
	return 0;
}

运行结果:
rdata = This is a test

格式化读写函数(fprintf()和fscanf())

函数调用:
int fscanf(文件指针,格式字符串,输入表列);
int fprintf(文件指针,格式字符串,输出表列);

函数功能:
从磁盘文件中读入或输出字符。

例:

fprintf(fp,"%d,%6.2f",i,t);
fscanf(fp,"%d,%f",&i,&t);

注意:用fprintf和fscanf函数对磁盘文件读写,使用方便,容易理解,但由于在输入时要将ASCII码转换为二进制形式,在输出时又要将二进制形式转换成字符,花费时间比较多。因此,在内存与磁盘频繁交换数据的情况下,最好不用fprintf和fscanf函数,而用fread和fwrite函数。

putw()和getw()

函数调用:
int putw(int w,FILE * fp);
int getw(FILE * fp);

函数功能: 对磁盘文件中读写一个字(以二进制形式从文件流中读取整数)。

注意:putw()和getw()都是按二进制输入输出的。所以如果你用putw()输入数据到文件后以文本的方式打开看到的将都是乱码。
同样如果你在文本文件中输入了数字并保存,用getw()来读入的话读入的结果并不是你想象的那样,因为它是按二进制读的。

实例:

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

int main()
{
	FILE *fp;
	int w;
	fp = fopen("2.txt","wb");   //以二进制形式写
	putw(5,fp); 
	fclose(fp);
	fp = fopen("2.txt","rb");//以二进制形式读
	w = getw(fp);
	printf("Successful read: w = %d\n", w);
	fclose(fp);
	return 0;
}

fgets函数

函数作用:从指定文件读入一个字符串。

函数调用:fgets(str,n,fp);
从fp指向的文件输入n-1个字符,在最后加一个’\0’
返回值:str的首地址

fputs函数

函数作用:
向指定的文件输出一个字符串。
函数调用:fgets("china",fp);
第一个参数可以是字符串常量、字符数组名或字符型
指针。字符串末尾的′\0′不输出。
返回值:
输入成功,返回值为0;
输入失败,返回EOF.

ferror函数(出错的检测)

调用形式:ferror(fp);
返回值:返回0,表示未出错;返回非0,表示出错。

在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。

clearerr函数(出错的检测)

调用形式:clearerr(fp);
函数作用:使文件错误标志和文件结束标志置为0。

只要出现错误标志,就一直保留,直到对同一文件调用clearerr函数或rewind函数,或任何其他一个输入输出函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值