C语言文件操作笔记

文件操作笔记

fopen():文件打开操作

头文件:stdio.h

函数定义:FILE *fopen(char *pname, char *mode)

函数说明:pname是文件名,mode是打开文件的方式

https://img-blog.csdn.net/20160304150401639?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
https://img-blog.csdn.net/20160304150432514?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
 

以“r+”的方式打开一个文件,会清空文件的原始内容,重新写入数据

返回值:

正常返回:FILE *一个指向文件在内存中的文件信息去的开头

异常返回:NULL,表示打开操作不成功

打开文件的作用是:
(1)分配给打开文件一个FILE 类型的文件结构体变量,并将有关信息填入文件结构体变量;
(2)开辟一个缓冲区;
(3)调用操作系统提供的打开文件或建立新文件功能,打开或建立指定文件;
FILE *:指出fopen是一个返回文件类型的指针函数;

(4)返回值
   正常返回:被打开文件的文件指针。
   异常返回:NULL,表示打开操作不成功。

 说明:C语言将计算机的输入输出设备都看作是文件。例如,键盘文件、屏幕文件等。ANSI C标准规定,在执行程序时系统先自动打开键盘、屏幕、错误三个文件。这三个文件的文件指针分别是:标准输入stdin、标准输出stdout和标准出错 stderr。

扫描二维码关注公众号,回复: 2239930 查看本文章

 fclose():文件关闭

函数定义:int fclose(FILE *fp);

函数说明:fp是一个以打开的文件的文件指针

返回值:

正常返回:0   

异常返回:EOF,表示文件在关闭时发生错误

 往文件中写格式化数据

1.函数原型

int fprintf(FILE *fp,char *format,arg_list)

2.功能说明
  将变量表列(arg_list)中的数据,按照format指出的格式,写入由fp指定的文件。fprintf()函数与printf()函数的功能相同,只是printf()函数是将数据写入屏幕文件(stdout)。
3.参数说明
  fp:这是个文件指针,指出要将数据写入的文件。
  format:这是个指向字符串的字符指针,字符串中含有要写出数据的格式,所以该字符串成为格式串。格式串描述的规则与printf()函数中的格式串相同。
    arg_list:是要写入文件的变量表列,各变量之间用逗号分隔。
4.无返回值

文件定位

A. 反绕
(1) 函数原型

void rewind(FILE *fp)

(2) 功能说明
   使由文件指针fp指定的文件的位置指针重新指向文件的开头位置。
(3) 参数说明
   fp:文件指针。
(4) 无返回值

B 随机定位
(1) 函数原型

int fseek(FILE *fp,long offset,int base)

(2) 功能说明
   使文件指针fp移到基于base的相对位置offset处。
(3)参数说明
   fp:文件指针。
   offset:相对base的字节位移量。这是个长整数,用以支持大于64KB的文件。
   base:文件位置指针移动的基准位置,是计算文件位置指针位移的基点。ANSI C定义了base的可能取值,以及这些取值的符号常量。

(4)返回值

  正常返回:当前指针位置。
  异常返回:-1,表示定位操作出错。

* 关于exit()函数
1. 函数原型

void exit(int status)

2. 功能说明
  exit()函数使程序立即终止执行,同时将缓冲区中剩余的数据输出并关闭所有已经打开的文件。
3. 参数说明
  status:为0值表示程序正常终止,为非0值表示一个定义错误。
4. 无返回值

* 关于feof()函数
1. 函数原型

int feof(FILE *fp)

2. 功能说明
   在文本文件(ASCII文件)中可以用值为-1的符号常量EOF来作为文件的结束符。但是在二进制文件中-1往往可能是一个有意义的数据,因此不能用它 来作为文件的结束标志。为了能有效判别文件是否结束,ANSI C提供了标准函数feof(),用来识别文件是否结束。
3. 参数说明
  fp:文件指针。
4. 返回值
  返回为非0值:已到文件尾。
  返回为0值:表示还未到文件尾。

 

 

文件操作重点在与对文件和内存的理解,即从文件到内存和从内存到文件,

以及格式化输入输出的理解。

 

举例:

/**

*   项目名称:文件操作举例

*   完成时间:2018年4月

*   开发平台:VS2017   win32

*   @未央

*/

# include<stdio.h>

# include<string.h>

# include<stdlib.h>

#include<malloc.h>

#include<windows.h>

# define F "数据.txt"    //文件路径(绝对路径)



typedef struct Student

{

    int num;    //学号

    char name[20];   //姓名

    char xy[100]; //学院

    char bj[15]; //班级

    struct Student *next;

}Stu;



//添加学生信息

void input(Stu *head)

{

    Stu *p=NULL;

    if((p=(Stu*)malloc(sizeof(Stu)))==NULL)

    {

        printf("\n\t\t内存空间不足!");

        exit(0);

    }

    p->next=NULL;

    printf("\t\t学院:");

    scanf("%s",p->xy);

    printf("\t\t班级:");

    scanf("%s",p->bj);

    printf("\t\t学号:");

    scanf("%d",&p->num);

    printf("\t\t姓名:");

    scanf("%s",p->name);

    while(head->next!=NULL)

    {

        head=head->next;

    }

    head->next=p;

}



//输出学生信息

void output(Stu *head)

{

    printf("---------------------------------------------------------------------\n");

    printf("学院         班级         学号            姓名\n");

    printf("---------------------------------------------------------------------\n");

    Stu *p=NULL;

    p=head->next;

    if(head==NULL)

    {

        printf("\n\t\t\t学生信息为空!\n");

    }

    else

    {

        while(p!=NULL)

        {

            printf("%s\t%s\t%d\t%s\n",p->xy,p->bj,p->num,p->name);

            p=p->next;

        }

    }

}



//写入文件

void write_file(Stu *head)

{

    FILE *fp;

    if((fp=fopen(F,"at+"))==NULL)

    {

        printf("文件打开失败!\n");

    }

    Stu *p=NULL;

    p=head;

    while(p!=NULL)

    {

       

        fprintf(fp,"%s\t",p->xy);

        fprintf(fp,"%s\t",p->bj);

        fprintf(fp,"%d\t",p->num);

        fprintf(fp,"%s\n",p->name);

        p=p->next;

    }

    // 刷新缓冲区,将缓冲区的内容写入文件

    fflush(fp);

    fclose(fp);

}



//读取文件、读取文件数据到链表

void read_file(Stu *head)

{

   

    printf("---------------------------------------------------------------------\n");

    printf("学院         班级         学号            姓名\n");

    printf("---------------------------------------------------------------------\n");

   

    Stu t;       //使用临时变量来存储文件中读取的内容

   

    FILE *fp;

    fp=fopen(F,"r");

    if(fp==NULL)                          //对文件是否成功打开的测试

    {

        printf("无法打开文件!\n");

        printf("返回上一级!\n");

        return;

    }

       

    while(fscanf(fp,"%s\t%s\t%d\t%s",t.xy,t.bj,&t.num,t.name)!=EOF)  //fscanf格式化输入

    {

        Stu *temp=(Stu *)malloc(sizeof(Stu));

        temp->next=NULL;

        printf("%s\t%s\t%d\t%s\n",t.xy,t.bj,t.num,t.name);

        strcpy(temp->xy,t.xy);

        strcpy(temp->bj,t.bj);

        temp->num=t.num;

        strcpy(temp->name,t.name);

        head->next=temp;         //temp的数据传给head的下一个结点

        head=temp;               //head后移

    }

    fclose(fp);

}



int main()

{

    Stu *head=NULL;                  //头指针

    head=(Stu *)malloc(sizeof(Stu));

    head->next=NULL;

    int a=-1;

    while(a)

    {

        system("cls");

        printf("\n\n\t\t----------------------学生宿舍管理系统----------------------\n\n");

        printf("\t\t☆☆ 1. 添加学生信息                        ☆☆\n\n");

        printf("\t\t☆☆ 2. 显示学生信息                        ☆☆\n\n");

        printf("\t\t☆☆ 3. 文件读入链表                        ☆☆\n\n");

        printf("\t\t☆☆ 4. 信息写入文件                        ☆☆\n\n");

        printf("\t\t☆☆ 0. 退 出  系 统                        ☆☆\n\n");

        printf("\t\t------------------------------------------------------------\n");

        printf("\t\t请选择功能(0-4):");

        scanf_s("%d",&a);

        switch(a)

        {

        case 1:

            system("cls");

            printf("\n\n\t\t-------------------------------------------------------\n\n");

            printf("\n\t\t\t输入学生数据\n\n");

            input(head);

            break;

        case 2:

            system("cls");

            printf("\n\t\t\t\t\t\t\t\t显示学生数据\n");

            output(head);

            system("pause");

            break;

        case 3:

            system("cls");

            read_file(head);

            printf("\n\t\t\t读取成功!\n");

            system("pause");

            break;

        case 4:

            write_file(head);

            printf("\n\t\t\t写入成功!\n");

            output(head);

            system("pause");

            break;

        case 0:

            printf("\n\t\t\t谢谢使用\n");

            exit(0);

        }

    }

}

 

猜你喜欢

转载自blog.csdn.net/qq_40270579/article/details/81099050
今日推荐