zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

IO操作大全

IO 操作 大全
2023-09-14 09:07:08 时间

一、文件基本知识

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

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

(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;
}