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函数,或任何其他一个输入输出函数。

猜你喜欢

转载自blog.csdn.net/qq_46485161/article/details/115277786
今日推荐