文件
这篇文章主要向大家介绍c语言中的文件操作,“文件”是指储存在外部介质上的相关数据的集合,数据集合的名称又叫文件名。文件有很多种类如:源程序文件、目标文件、可执行文件、库文件等。文件从编码方式上分为两类,文本文件和二进制文件。文本文件在储存时用户可以直接读懂的字符,而二进制文件在储存时则是把用户输入的数据转换成二进制的储存格式进行储存,用户直接看上去就是一堆读不懂的乱码。但二进制文件的优点在与存取速度快、占用空间小、可随机存取数据。
在c语言中,对文件的读取和写入操作是采用流方式处理的,即把外部介质上文件中的数据读取到当前程序中,称为输入流;把程序中的数据写入到文件中称为输出流。
在对文件进行存取工作时需要先打开文件,而打开文件需要定义一个文件指针,用该指针实现对文件的操作,指针定义如下:FILE *指针变量名; 例如:FILE *fp 其中fp就是指向文件的指针。有了指针之后还需要一个打开文件的函数:fopen 函数
具体操作:fp=fopen("文件名","打开文件的方式");
上述操作中提到的“打开文件的方式”分为 只读、只写、读写、追加 四种方式,
只读:"r":打开一个已存在的文件,只能读取;"rb":打开一个二进制文件,只读。
只写:"w":写入一个文本文件;
"wb":写入一个二进制文件;
读写:"r+"、"rb+"、"w+"、"wb+"、"a+"、"ab+":以上方式即可读取文件也可写入文件。
追加:"a"、"ab":在已有文件的后方追加新的内容。
其中上述方式中含有”w“字母的方式,如文件不存在则创建文件,若已存在则清空原内容。含有”a"字母的方式,如果文件不存在则新建一个文件,若已存在则在原文件的内容后追加新的内容。
例如:FILE *fp;
fp=fopen("D:\\file.txt","r");
这样,一个文件就被打开了,一般我们会判断文件是否成功打开,fopen如果打开文件失败则会返回NULL,所以一般判断代码串如下
FILE *fp;
fp=fopen(filename,"w+");
if(fp==NULL)
{
printf("打开文件失败!");
return 0;
}
文件打开成功后便可以对其进行读写操作,读写操作分为顺序读写和随机读写两类,顺序读写是从文件的第一个数据开始;随机读写则需要运用文件位置指针,定位到你学要操作的位置。主要的读写操作有:字符读写函数、字符串读写函数、格式化读写函数、数据块读写函数。
字符读写函数:fgetc:从文件中读取一个字符 ch = fgetc (fp) ;
fputc:将一个字符输入得到文件中 fputs (ch , fp) ;
字符串读写函数:fgets:从fp指定文件中读取n-1个字符,存入到指定的能存放字符串的变量中。
fgets (char *str,int n ,FILE *fp);
fputs:把指定的字符串输入到文件中。
fputs (char *str ,FILE *fp);
格式化读写函数:fscanf (FILE *fp ,char *format , char *arg_list);
fprintf( FILE *fp , char *format , char *arg_list);
格式化输入函数的主要i功能特点是能够把任意格式的数据输入到文件中,如结构数据等
数据块读写函数:fread (viod *buffer , unsigned size , unsigned count , FILE *fp) ;
fwrite (viod *buffer , unsigned size , unsigned count , FILE *fp) ;
数据块读写函数的执行方式和功能与格式化读写函数相似,一般在需要输入大量的数据时则采用数据块输入函数,因为数据块读写函数是将数据以二进制储存的方式把数据存入文件中,所以处理较快。
通过操作上述的几种输入输出函数就可以对文件实现简单的操作,但所能实现的都是顺序读写,如果需要随机读写还需要用到文件的定位。
文件定位函数有三种,常用的移动文件指针的函数有 rewind和fseek两种。还有一种是显示指针当前位置的函数 ftell 这里不做介绍。
rewind (FILE *fp);该函数的作用是把文件指针重新定义到文件首,一般在进行完一定操作后指针停留在文件尾,可通过该函数重新从文件首开始操作。
fseek (FILE *fp,lon offset , int base);将文件指针fp移动到基于base的相对位置offset处。
例:fseek (fp , 100L , 0) ; 表示把文件位置指针移动到距离文件头100字节处;
fseek (fp , -20 , 1 ) ; 沿文件首方向移动20字节。
具体操作示例:fseek (fp , (n-1)*sizeof(数据名), 0 ); (n-1)表示第n个,sizeof(数据名)表示一个数据所占的字节数。
以上便简单介绍了一个文件定义、打开、读写操作、定位等功能,这些便可以进行操作一个文件,但操作完文件后话需要把文件关闭,需要用到关闭函数 fclose函数
例如 fclose ( fp );
一般关闭函数也需要验证是否关闭成功,如果文件未关闭或关闭失败那么可能会导致文件内容的丢失,验证代码段如下
if(fclose(fp)==0)
{
printf("文件已关闭!");
}
以上便是C语言文件这一章节的基本内容概况,下面给大家分享一个利用文件操作实现的“打印商品小票”的功能的代码,用以学习和练习喔。
#include <stdio.h>
typedef struct Rec
{
char id[10];
char name[20];
float price;
int count;
}Rec;
void Writefile(FILE *fp,int n);//输入的信息写入文件
void Readfile(FILE *fp,int n);//从文件中读取信息
int main()
{
char filename[50];
FILE *fp;
int n;
printf("请输入目标文件名:");
gets(filename);
printf("\n");
fp=fopen(filename,"w+");
if(fp==NULL)
{
printf("打开文件失败!");
return 0;
}
printf("请输入商品的数量:");
scanf("%d",&n);
printf("\n");
Writefile(fp,n);
Readfile(fp,n);
if(fclose(fp)==0)
{
printf("文件已关闭!");
}
return 0;
}
void Writefile(FILE *fp,int n)
{
int i;
Rec record;
printf("************请输入商品数据************\n");
for(i=1;i<=n;i++)
{
printf("商品序号:");
scanf("%s",record.id);
printf("商品名称:");
scanf("%s",record.name);
printf("商品价格:");
scanf("%f",&record.price);
printf("商品数量:");
scanf("%d",&record.count);
printf("\n");
fprintf(fp,"%s %s %5.2f %d\n",record.id,record.name,record.price,record.count);
}
rewind(fp);
}
void Readfile(FILE *fp,int n)
{
Rec record;
double total=0,x=0;
printf("打印小票:\n");
while(fscanf(fp,"%s %s %f %d\n",record.id,record.name,&record.price,&record.count)!=EOF)
{
x=record.price*record.count;
printf("序号:%s 名称:%s 价格:%5.2f 数量:%d 金额:%5.2f\n"
,record.id,record.name,record.price,record.count,x);
total+=record.price*record.count;//计算总价
}
printf("合计:%5.2f\n",total);
}
谢谢阅读!