文件IO操作大全

来源:互联网 发布:广联达破解软件下载 编辑:程序博客网 时间:2024/06/05 00:28

一、文件基本知识

“文件是指一组相关数据的有序集合”,这个数据集的名称就是文件名。所有文件都是通过流的形式进行输入输出操作的。流是一个数据字节的序列。流入程序的流称为输入流,流出程序的流称为输出流。

流可分为两大类:文本流二进制流

(1)文本刘是一种字符序列,仅包含字符。

(2)二进制流是一种二进制序列,与外设中的字节序列一一对应,不对字节中的内容进行转换,如遇到换行符也不会执行换行操作。


文本又可以分为文本文件二进制文本文件两大类。

(1)文本文件又称ASCII文件,也称字符文件。这种文件保存时,每个字符对应一个字节,用于存放对应的ASCII码。可通过输出设备显示,是我们能够读懂的内容。

(2)二进制文件是由0和1组成的一段序列,用二进制的方式保存文件内容。虽然二进制也能够输出显示,但是只有机器能够读懂它的意思。


二、文件的基本操作

1.文件指针

文件指针是缓冲文件系统中的关键概念,C系统为每个打开的文件在内存中开辟一个缓冲区,用于存放文件的有关信息,这些信息包括文件名,状态和文件存储位置等等。

文件指针是一个有指向文件有关信息的指针,它保存在FILE结构体变量中。该结构体类型由系统定义,声明如下:

typedef struct{    short level;                /*缓冲区的使用量*/    unsigned flags;             /*标志文件状态*/    char fd;                    /*文件号*/    unsigned char hold;         /* 无缓冲区取消字符输入*/    short bsize;                /*缓冲区大小默认值512*/    unsigned char *buffer;      /*缓冲区指针*/    unsigned ar *curp;          /*无活动指针*/    unsigned istemp;            /*草稿文件标识*/    short token;                /*做正确性检测*/}FILE;

2.文件打开fopen()和关闭fclose()

(1)文件打开fopen()

fopen()函数是ANSIC规定的标准输入/输出函数库中的函数。打开文件的操作就是创建一个流。

头文件:#include <stdio.h>

函数调用形式:fp = fopen("文件名","使用文件方式");

功能:以某种使用方式打开文件

返回值:若文件打开成功返回 一个有确定指向的FILE指针,打开失败则返回NULL。


使用方式含义

r打开只读文件,该文件必须存在。
r+打开可读写的文件,该文件必须存在。
w打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。

rb打开一个二进制文件,只允许读数据

rb+打开一个二进制文件,允许读和写

wb打开或建立一个二进制文件,只允许写数据

wb+打开或建立一个二进制文件,允许读和写

ab打开一个二进制文件,并在文件末尾写数据

ab+打开一个二进制文件,允许读,或在文件末追加数据

总结以上使用方式的特点:

①r(read)代表读,w(write)代表写,a(append)追加。

②r为打开只读文件,即文件存在才能读;w为打开只写文件,若文件不存在则建立,文件存在则先将文件内容清空再写数据;a为追加的方式写入数据,即文件不存在则建立,若文件存在,原文件内容不清空,并在末尾写入数据。

③b代表二进制的标识,意思是对二进制文件操作

④+代表可读和可写


(2)文件关闭fcolse()

文件使用完毕后,应将其关闭,关闭的意思是文件指针变量不再指向该文件。如果不将已打开的文件关闭的话,是危险的。

头文件:#include <stdio.h>

函数调用形式:fclose(文件指针名);

功能:关闭文件指针fp指向的文件

返回值:若正常关闭文件返回值为0,关闭失败则返回EOF(即-1)。


3.文件读/写函数

(1)写字符函数——fputc()

头文件:#include <stdio.h>

函数调用形式:fputc(字符,文件指针名);

功能:把一个字符写到fp所指向的文件中去。

返回值:输出成供返回值就是输出的字符,输出失败返回EOF(即-1)

函数实现:通过fputc写入一个字符到fputc.txt文件中

#include <stdio.h>#include <stdlib.h>int main(){    FILE *fp;//定义一个指向FILE类型结构体的指针变量fp    char ch;    if((fp = fopen("C:\\Users\\Administrator\\Desktop\\fputc.txt","w")) == NULL)//以只写方式打开文件,这里注意是用两个“\”    {        printf("打开文件失败!\n");        exit(0);    }    ch = getchar();     //获取从键盘输入的字符    while(ch != '#')    //输入#停止输入    {        fputc(ch,fp);   //将ch字符写入到文件中        ch = getchar();    }    fclose(fp);         //关闭fp指向的文件    return 0;}



(2)读字符函数——fgetc()

头文件:#include <stdio.h>

函数调用形式:字符变量 = fgetc(文件指针名);

功能:从文件指针指向的磁盘文件中读取一个字符

返回值:函数遇到文件结束符时将返回一个文件结束标志EOF(即-1)。

函数实现:通过fgetc读出fgetc.txt文件中内容

#include <stdio.h>#include <stdlib.h>int main(){    FILE *fp;//定义一个指向FILE类型结构体的指针变量fp    char ch;    if((fp = fopen("C:\\Users\\Administrator\\Desktop\\fgetc.txt","r")) == NULL)//以只读方式打开文件,文件必须存在    {        printf("打开文件失败!\n");        exit(0);    }    ch = fgetc(fp);     //获取从键盘输入的字符    while(ch != EOF)    //输入#停止输入    {        putchar(ch);    //将ch字符写入到文件中        ch = fgetc(fp); //重复使用fgetc读取文件内容    }    fclose(fp);         //关闭fp指向的文件    return 0;}


(3)写字符串函数——fputs()

头文件:#include <stdio.h>

函数调用形式:fputs(字符串,文件指针);

功能:向指定的文件写入一个字符串,其中字符串可以是字符串常量,也可以是字符数组名、指针或变量

返回值:若成功则返回写出的字符个数,返回EOF则表示有错误发生。

函数实现:使用fputs向指定的磁盘文件写入字符串

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    char filename[30],str[30];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"w")) == NULL)//以只写方式打开文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    printf("请输入字符串:\n");    getchar();    gets(str);    fputs(str,fp);  //将str写入到指定的文件中    fclose(fp);     //关闭文件    return 0;}



(4)读字符串函数——fgets()

头文件:#include <stdio.h>

函数调用形式:fgets(字符数组名,n,文件指针)

功能:从指定的文件中读取一个字符串到字符数组中。n表示所得到的字符串中字符的个数。

返回值:若成功则返回数组首地址,返回NULL则表示有错误发生。


函数实现:使用fgets()读取磁盘文件中的文件内容

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    char filename[30],str[100];        printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"r")) == NULL)//以只读方式打开文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    fgets(str,sizeof(str),fp);//读出文件中的内容,若成功则返回str的内容    printf("%s\n",str);    fclose(fp);     //关闭文件    return 0;}


(5)格式化写入函数——fprintf()

格式化就是把想要输出的数据,按照一定的格式输出。

头文件:#include <stdio.h>

函数调用形式:ch = fprintf(文件类型指针,格式字符串,输出列表)

功能:fprintf(fp,"%d",i);将整型变量i的值按%d的格式输出到fp所指向的文件上。

返回值:成功时返回转换的字节数,失败时返回一个负数

函数实现:使用fprintf将数字以字符形式写入磁盘文件

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    int i = 65;    char filename[30];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"w")) == NULL)//以只写方式打开文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    fprintf(fp,"%c",i);    fclose(fp);     //关闭文件    return 0;}




(6)格式化读取函数——fscanf()

头文件:#include <stdio.h>

函数调用形式:ch = fprintf(文件类型指针,格式字符串,输入列表)

功能:fprintf(fp,"%d",i);读入fp所指向的文件上的i值

返回值:成功时返回转换的字节数,失败时返回一个负数

函数实现:使用fscanf将磁盘中的字符以整数形式输出

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    int i ,j;    char filename[30];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"r")) == NULL)//以只读方式打开文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    for(i = 0 ; i < 14 ; i++)    {        fscanf(fp,"%c",&j);        printf("%d 是 : %5d\n",i+1,j);    }    fclose(fp);     //关闭文件    return 0;}



(7)数据块读/写函数——fread()/fwrite)()

头文件:#include <stdio.h>

函数调用形式:fread(buffer,size,count,fp)fwrite(buffer,size,count,fp);

功能:从fp所指的文件中读入/写入count次,每次读出大小为size个字节,并将读入/输出的信息保存在buffer地址中

返回值:若成功返回实际/读入/写入的count数目

函数实现:使用fread和fwrite实现将录入的通讯录信息保存到磁盘文件中,在录入完信息后,要将所录入的信息全部显示出来。

#include <stdio.h>#include <process.h>struct address_list{    char name[10];    char adr[20];    char tel[15];}info[100];void save(char *name,int n){    FILE *fp;    int i;    if((fp = fopen(name,"wb")) == NULL)//以只写方式打开二进制文件    {        printf("打开文件失败!\n");        exit(0);    }    for(i = 0 ; i < n ; i++)        if(fwrite(&info[i],sizeof(struct address_list),1,fp) != 1)            printf("文件写入失败!\n");    fclose(fp);}void show(char *name,int n){    int i;    FILE *fp;    if((fp = fopen(name,"rb")) == NULL)//以只读方式打开二进制文件    {        printf("打开文件失败!\n");        exit(0);    }    for(i = 0 ; i < n ; i++)    {        fread(&info[i],sizeof(struct address_list),1,fp);        printf("%15s%20s%20s\n",info[i].name,info[i].adr,info[i].tel);    }    fclose(fp);}int main(){    int i,n;    char filename[30];    printf("请输入学生个数:");    scanf("%d",&n);    printf("请输入文件路径:\n");    scanf("%s",filename);    printf("请输入学生的姓名、地址和电话:\n");    for( i = 0 ; i < n ; i++)    {        printf("NO.%d",i+1);        scanf("%s%s%s",info[i].name,info[i].adr,info[i].tel);        save(filename,n);    }    show(filename,n);    return 0;}


4.定位文件

(1)随记读写操作——fseek()

头文件:#include <stdio.h>

函数调用形式:fseek(文件类型指针,位移量,起始点);

功能:用来移动文件内部位置指针。位移量表示移动的字节数,要求位移量是long型数据,以便在文件长度大于64kb时不会出错

起始点的表示方法

文件首  :表示符号为SEEK-SET,数字表示0

文件当前位置: 表示符号为SEEK-CUR,数字表示1

文件末尾:表示符号为SEEK-END,数字表示2

函数实现:向任意一个二进制文件中写入一个长度大于7的字符串,然后从该字符串的第7个字符开始输出余下字符。

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    int i ,j;    char filename[30],str[50];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"wb")) == NULL)//以只写方式打开二进制文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    printf("请输入字符串:\n");    getchar();    gets(str);    fputs(str,fp);  //将str写入到指定的文件中    fclose(fp);     //关闭文件    if((fp = fopen(filename,"rb")) == NULL)//以只读方式打开二进制文件    {        printf("打开文件失败!\n");        getchar();//输入任意键继续        exit(0);    }    fseek(fp,6l,0);    fgets(str,sizeof(str),fp);    putchar('\n');    puts(str);    fclose(fp);     //关闭文件    return 0;}

(2)返回位置指针——rewind()

头文件:#include <stdio.h>

函数调用形式:int rewind(文件类型指针);

功能:使位置指针重新返回文件的开头

函数实现:先输出一个文件的内容,再使用rewind返回文件开头,再输出一次。

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    char ch,filename[30];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"r")) == NULL)//以读方式打开二进制文件    {        printf("打开文件失败!\n");        exit(0);    }    ch = fgetc(fp);    while(ch != EOF)    {        putchar(ch);        ch = fgetc(fp);    }    printf("\n");    rewind(fp);    ch = fgetc(fp);    while(ch != EOF)    {        putchar(ch);        ch = fgetc(fp);    }    printf("\n");    fclose(fp);     //关闭文件    return 0;}



(3)得到文件位置——ftell()

头文件:#include <stdio.h>

函数调用形式:long ftell(文件类型指针);

功能:得到流式文件中的当前位置,用相对于文件开头的位移量来表示

返回值:当返回值为-1L时表示出错。

函数实现:使用ftell求文件中的字符串长度

#include <stdio.h>#include <process.h>int main(){    FILE *fp;    int n;    char ch,filename[30];    printf("请输入文件路径:\n");    scanf("%s",filename);    if((fp = fopen(filename,"r")) == NULL)//以读方式打开文件    {        printf("打开文件失败!\n");        exit(0);    }    ch = fgetc(fp);    while(ch != EOF)    {        putchar(ch);        ch = fgetc(fp);    }    n = ftell(fp);    printf("\n这个字符串的长度为:%d\n",n);    fclose(fp);     //关闭文件    return 0;}



原创粉丝点击