黑马程序员——C语言日志——文件的操作

本文介绍了C语言中文件操作的基本方法,包括文件的使用方式、操作步骤和常用函数。文件的使用方式包括r、w、a等模式,文件操作通常涉及定义文件指针、打开文件、操作文件和关闭文件四个步骤。文章详细讲解了fputc、fgetc、fputs、fgets、fread和fwrite等函数的用法,并提到了文件指针的移动及随机读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、文件的使用方式

文件的使用方式由r,w,a,+,t,b两个字符拼成,各个字符的含义是:

r(read):读

w(write):写

a(append):追加

t:文本文件

b(banary):二进制文件

+:读和写

在实际操作中:

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

二、文件操作的一般步骤

1、定义文件指针

2、打开文件

3、操作文件

4、关闭文件

看代码:

#include <stdio.h>

int main(int argc, const char * argv[]) {
    //1、定义文件指针
    FILE *fp=NULL;//FILE结构体类型指针
    //2、打开文件
    fp = fopen("a.txt", "r");
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
    if(fp!=NULL)
    {
        //3、操作文件
        printf("文件打开成功!\n");
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
//4、关闭文件
    fclose(fp);
    retun 0;
}


三、文件操作函数

1、字符的读写函数fputc和fgetc

字符的读写函数是以字符字节为单位的读写函数,每次可以从文件中读出或者写入一个字符。
fputc函数的功能就是向文件中写入一个字符,调用形式为:
fputc(字符量,fp);
fgetc函数的功能是从指定文件中读出一个字符,调用形式为
fgetc(fp);

在代码中实现:

/****写文件*********/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fputc.txt", "w");//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
   char str[]="hello word!";
    if(fp!=NULL)
    {
        //操作文件
        for(int i=0;i<strlen(str);i++)
        {
            fputc(str[i], fp);//写入一个字符
   
        }
        
        printf("文件打开成功!\n");
        
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
   
    return 0;

/****读文件*********/

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
  //  int j=0;
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fputc.txt", "r");//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
   char str[]="hello word!";
   // char str1[30];
    if(fp!=NULL)
    {
        //操作文件
       /* for(int i=0;i<strlen(str);i++)
        {
            fputc(str[i], fp);//写入一个字符
   
        }*/
        char ch=fgetc(fp);
        while (ch!=EOF)
        {
            putchar(ch);
            ch=fgetc(fp);  
        }
                printf("文件打开成功!\n");
        
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
   
    return 0;
}

/**********读写文件**********/
include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
  //  int j=0;
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fputc.txt", “w+”);//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
   char str[]="hello word!";
   // char str1[30];
    if(fp!=NULL)
    {
        //操作文件
        for(int i=0;i<strlen(str);i++)
        {
            fputc(str[i], fp);//写入一个字符
   
        }
        rewind(fp);  //将fp指针指向第一个字符
       char ch=fgetc(fp);
        while (ch!=EOF)   //判断是否到达文件结尾,EOF表示文件结尾标志
        {
            putchar(ch);
           ch=fgetc(fp);
        }
                printf("文件打开成功!\n");
        
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
   
    return 0;
}

最后一段代码中,我们打开了一个文件,在关闭这个文件之前,我们进行了先写再读的操作(w+)。在进行完写操作之后,fp的指针指到了文件中字符串str的最后一个字符的地址,因此在进行读操作之前,需要将fp的指针调回指向第一个字符h的地址,我们才能继续进行读操作。这里我们用到的rewind函数,就是这个功能。

2、字符串的读写函数fputs和fgets

fputs函数是向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数;否则返回EOF(符号常量,其值为-1)。

fputs的调用形式为

fputs(字符串首地址,fp);

文件结构体指针stream中读取数据,每次读取一行。读取的数据保存在buf指向的字符数组中,每次最多读取bufsize-1个字符(第bufsize个字符赋'\0'),如果文件中的该行,不足bufsize个字符,则读完该行就结束。如若该行(包括最后一个换行符)的字符数超过bufsize-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字符结尾,对fgets的下一次调用会继续读该行

fputs的调用形式为

fgets(将要存储字符地址,读取字符大小,fp);

/*******fputs函数**********/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
    //  int j=0;
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fputs.txt", “w”);//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
    
    char *str="hello china!";
    if(fp!=NULL)
    {
        //操作文件
        fputs(str, fp);  //写入字符串
                printf("文件打开成功!\n");
        
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
    
    return 0;
}


/*****读出**********/

#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
    //  int j=0;
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fputs.txt", "r");//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
    
    // char *str="hello china!";
    char str1[20];
    if(fp!=NULL)
    {
        //操作文件
       // fputs(str, fp);
                printf("文件打开成功!\n");
        //fgets读取的时候当稳健内容读取完毕,会給字符加上结束符\0
        //读取的时候,遇到\n或者EOF,读取完毕
        fgets(str1, 20, fp);
        printf("%s\n",str1);
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
    
    return 0;
}

3、数据块的读写,fread函数和fwrite函数

C语言中还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组,一个结构体的值等。
度数据块函数调用的一般形式为:
fread(buffer,size,count,fp);
写函数块的形式:
fwrite(buffer,size,count,fp);
其中:buffer是一个指针,在fread函数中,它表示存放输入数据的首地址,在fwrite函数中它表示输出数据的首地址。
size表示数据块的字节数。
count表示要读写数据块的块数。
fp表示文件指针。
例如:fread(fa,4,5,fp)
其意义是从fp中每次度4个字节送入数组fa中,连续度5次,即读五个实数到fa中。

/*******fwrite和fread函数*******/
#include <stdio.h>
#include <string.h>
int main(int argc, const char * argv[]) {
    //定义文件指针
    //  int j=0;
    FILE *fp=NULL;//FILE结构体类型指针
    //打开文件
    fp = fopen("fwrite.txt", "w+");//操作方式为写
    //fopen打开成功返回文件首地址,失败就返回NULL,一般做一个判断,如果成功我们就再读文件
    
     char *str="hello china!";
    char str1[20];
    
    if(fp!=NULL)
    {
        //操作文件
        //写如一块长度为str的字符块到fp
         fwrite(str, strlen(str),1,fp);
        printf("文件打开成功!\n");
        //利用rewind函数将指针指向第一个字符
        rewind(fp);
        //读取fp中长度为str的字符块,读一次
        fread(str1, strlen(str),1, fp);
        printf("%s\n",str1);
    }
    else{
        //给用户一个提示
        printf("文件打开失败,按任意键退出!\n");
        getchar();//按任意键
        exit(1); //退出
    }
    //关闭文件
    fclose(fp);
    
    return 0;
}
4、fscanf和fprintf 格式读写函数

和scanf和printf 函数类似,是格式化输入输出数据的函数。

/*******fscanf和fprintf函数*******/
#include <stdio.h>
int main(int argc, const char * argv[]) {
    int m;
    char ch;
    FILE *fp=fopen("fprintf.txt", "w+");
    if(fp!=NULL)
    {
        //操作文件
        //将数据以2#f;的格式写入文件中
        fprintf(fp,"%d#%c;", 2,'f');
                printf("打开文件成功!");
        //将fp指针指向第一个字符
        rewind(fp);
        //从文件中读出数据,并存入变量m,ch中
        fscanf(fp, "%d#%c;",&m,&ch);
        //打印出m,ch的值
        printf("%d,%c",m,ch);
        
            }
    
    else
    {
        printf("打开文件失败!");
        exit(1);
    }
    fclose(fp);
    return 0;
}
5、文件的随机读写实现,fseek函数
前面额稍加对文件的读写都是顺序读写,即读写文件只能从头开始,顺序读写各个数据,但在实际问题中常要求只读文件中某一指定的部分,为了解决这个问题可移动文件内部的位置指针到需要读写的位置,再进行读写,这种读写称为随机读写。
实现随机读写的关键是要按要求移动位置指针,这称为文件的定位。
1)文件的定位
移动文件内部位置指针的函数主要有两个,即rewind()和fseek()。
rewind()函数前面已经使用过多次,其调用形式为:
rewind(文件指针);
它的功能是将文件的内部位置指针移到文件首。
下面主要介绍fseek函数,发seek函数用来移动文件内部位置指针,其调用形式为:
fseek(文件指针,位移量,起始点);
其中,文件指针指向被移动的文件;位移量表示移动的字节数,要求位移量是long型的数据,以使文件长度大于64KB时不会出错。当用常量表示位移量时,要求后缀“L”。
起始点表示从何处开始计算位移量,规定的起始点有三种:文件首,当前位置和文件尾。

起始地址            代表字符                代表数
文件首:            SEEK_SET            0
当前位置:        SEEK_CUR           1
文件末尾:         SEEK_END          2
例如:fseek(fp,100L0);
意思是把位置指针移向离文件首100个字节的位置。
还要说明的是fseek函数一般用于第二进制文件。在文件中由于要进行转换,所以往往计算的位置会出现错误。
2)文件的随机读写
在移动位置指针之后,即可以使用前面介绍的任意一种读写函数进行读写,由于一般是读写一个数据块,因此常用fread和fwrite函数。下面看例子:

/*********fseek函数文件的随机读写*********/
#include <stdio.h>
struct Student {
    char name[20];
    int age;
    float score;
    
};
int main(int argc, const char * argv[]) {
    //定义一个结构体
    struct Student std[3]={{"王明",18,78.5},{"李帅",19,88.6},{"张莉",17,99.0}};
    struct Student std3={"赵龙",20,68.7},std4;
    FILE *fp=fopen("fseek.txt", "w+");
    if(fp!=NULL)
    {
        //操作文件
        //将结构体数组std[3]中的三组数据写入文件fp中
        for(int i=0;i<3;i++){
            
            fwrite(&std[i], sizeof(struct Student), 1, fp);
        }
        printf("打开文件成功!");
        //将文件指针指到std[1]的位置,并且将std3替换std[1]
        fseek(fp, sizeof(struct Student), 0);
        //替换
        fwrite(&std3, sizeof(struct Student), 1, fp);
        //将文件指针指到std[1]的位置
        fseek(fp, sizeof(struct Student), 0);
        //将替换后的std[1]读出并写入std4中
        fread(&std4, sizeof(struct Student), 1, fp);
        //打印std4中各变量
        printf("名字:%s  年龄:%d  成绩:%.2f:",std4.name,std4.age,std4.score);
    }
    
    else
    {
        printf("打开文件失败!");
        exit(1);
    }
    fclose(fp);
    return 0;
}
好了,今天就介绍到这里。简单地举例说明了文件中操作中用到的从操作字符到操作字符块的一些函数。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值