c语言里面ANSI c标准采用缓冲文件系统处理文件,当处理数据的时候系统自动在内存区 为每一个正在使用文件开辟一个文件缓存区。从内存向磁盘输出数据必须先经过内存里面的缓冲区,当缓冲区充满之后,所有的文件一起被送到程序的数据区:
在缓冲系统里面每个被使用的文件都在内存里面开辟一个相应的文件信息区,用来存放文件的相关信息,,因此就有一个文件类型的指针,简称文件指针。文件指针原型如下:
#ifndef _FILE_DEFINED
struct _iobuf {
char *_ptr;
int _cnt;
char *_base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char *_tmpfname;
};
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif /* _FILE_DEFINED */
该结构体类型是由系统声明 的,取名为FILE。
下面定义一个文件变量的指针:
FILE *fp;
fp是一个可以指向文件类型的指针变量。即是文件指针指向某个文件信息区域,通过文件指针变量可以找到与之相关的文件(若有n个文件,就必须定义n个文件指针,每一个指针变量指向唯一的一个文件信息区域)。
打开和关闭文件
打开文件用函数fopen,fopen的调用方式为:fopen(文件名,使用调用方式);
FILE *fp;
fp = fopen("a1","r");
这样就可以让一个文件指针fp指向a1所在文件区域。
主要的文件使用方式:
“r”(只读) 打开一个已经存在的文本文件
“w”(只写) 打开一个文本文件,当文件不存在的时候,会自动创建一个新文件
“a” (追加) 向文本文件尾添加数据
“rb”(只读) 打开一个二进制文本文件
“wb”(只写) 为了输入数据,打开一个二进制文件
“ab”(追加) 向二进制文件尾添加数据
关闭文件用函数fclose,fclose的用法为:fclose(文件指针)。
FILE *fp;
fp = fopen("a1","r");
fclose(fp);
将前面打开的文件指针传递给fclose函数,fp指向的函数关闭,此后fp不在指向该文件。
顺序读写数据文件
对文本文件的读入或输出调用的函数分别为fgetc和fputc,fgetc函数是向指定的文件读入一个字符,若读入成功,则带回所读的字符,失败则返回文件结束标志(EOF)。
fputc函数是把指定字符写到指定的指针变量里面,输入成功则返回输出的字符,失败返回文件结束标志。
例如:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
FILE *fp;
char ch = 0;
char filename[10];
printf("输入作用文件名:");
scanf("%s",filename);
if (fp=fopen(filename,"w")==NULL) //打开输入文件,并且fp指向在这个文件
{
printf("无法打开文件!");
exit(EXIT_FAILURE);
}
ch = getchar();
printf("输入字符串(以#结束)");
ch = getchar(); //接受键盘输入的字符
while (ch!='#')
{
fputc(ch,fp); //向磁盘文件输入一个字符
putchar(ch); //将输入的字符打印出来
ch = getchar(); //再次接受键盘输入的字符
}
fclose(fp); //关闭文件
putchar (10);
return 0;
}
用fopen函数打开一个只读文件,如果打开成功,函数的返回值就是该文件所建立的初始地址,把它赋值 给fp指针。如果打开失败,则输出错误信息,并且直接终止程序。
在程序里面,如果不定义文件名,可以直接在fopen的后面直接以字符串常量的形式。
向文件读写一个字符串
向文件里面读写一个字符串的时候用带的函数是:fgets和fputs。fgets的调用形式是fgets(str,n,fp),其作用是从fp所指向的文件里面读入一个长度为n-1的字符串,存放
在字符数组str里面。如果读取成功返回str的地址,失败则返回null;
fputs的调用形式为:fputs(str,fp);作用是将str中的字符串写到fp做指向的文件里面去。函数若调用成功返回非0值,失败则返回0;
#include<stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
if((fp = fopen("hehe.dat","w"))== NULL)
{
printf("open file error!\n");
exit(EXIT_FAILURE);
}
fputs("china",fp);
fclose(fp);
return 0;
}
程序里面先创建一个文件,再将字符串写进fp所指向的文本文件里面去。
使用格式化的方式读写文件
前面的文件读写是字符的输入和输出,但是在实际应用的时候数据 的类型是多种多样的。
这是就需要对文本文件进行格式化的方式读写文件,其用到的函数书fprintf和fscanf,和标准的格式化输入和输出基本相似。
fprintf函数调用方式为fprintf(文件指针,格式字符串,输出列表)。
fscanf函数的调用方式为fscanf(文件指针,格式字符串,输入列表)。
例如:
将1,3.14,“hehe”用格式化方式读写文件。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 1;
double pi = 3.14;
char arr[] = "hehe";
FILE *fp;
if ((fp = fopen("hehe","w")) == NULL)
{
printf("Open file error!\n");
exit(EXIT_FAILURE);
}
fscanf(fp,"%d %lf %s",&i, &pi,arr);
fprintf(fp,"%d %lf %s",i,pi,arr);
fclose(fp);
return 0;
}
用二进制形式向文件读写数据
使用二进制向文件里面读写数据需要使用的函数是fread和fwrite
fread函数的调用的形式为:fread(buffer,size,count,fp)
fwrite函数的调用形式为:fwrite(buffer,size,count,fp)
buffer为地址,size为读取的数据类型的大小,count为读取数据的个数,fp为文件地址
例如:
void save()
{
FILE *fp;
int i = 0;
if ((fp = fopen("stu.dat","wb")) == NULL) //打开stu.dat文件
{
printf("Open file error!\n");
exit(EXIT_FAILURE);
}
for (i=0;i<size;i++)
{
if (fwrite(&stu[i],sizeof(struct Student),1,fp) != 1) //以二进制形式将数据写入文件
{
printf("File write error\n");
exit(EXIT_FAILURE);
}
}
fclose(fp);
}