【C语言】文件操作

文件操作

(1)文件的简述

在程序设计中,存在着两种文件:

  1. 程序文件
  2. 数据文件

文件都需要名称来确定其存在,文件名有一定的格式:

//文件名 = 文件路径 + 文件名主干 + 文件后缀
//举个例子:
"c:\code\test.txt"

(2)文件的打开与关闭

(0)文件的使用方式

文件有多种使用方式,我们可以通过不同的文件打开方式来实现对文件的不同使用操作

image-20221009140558157

(1)文件指针

定义:通过文件指针可以找到与之相关的文件

IMG_0615

FILE 是 C语言文件结构定义,打开文件文件操作要用到这类结构。可以看成变量类型,用于变量声明。这个是一种数据结构类型,用来表示一个文件的相关信息,如果定义了一个文件指针,就用这个指针来指向某个文件,然后就能使用这个指针对文件来进行操作了

(2)文件打开与关闭

先介绍两个重要的函数:

image-20221009135539188 image-20221009135616957

显而易见,fopen()、fclose()这两个函数作用对立,代表着对于文件的开与关操作。

下面我们来简单介绍这两个函数的使用:

int main()
{
    //打开文件
    FILE *pf = fopen("c:\\code\\test.txt","w");//先声明文件名,再明确文件的使用方式
    //FILE *pf = fopen("test.txt","w");这是文件的相对路径表达,上一行是绝对路径,很显然
    if(pf == NULL)
    {
        perror("fopen");
        return 1;
    }//fopen()打开文件成功后会返回地址,打开失败会返回空指针,故需要检验!
    //写文件
    //...
    //...
    //...
    //关闭文件
    fclose(pf);
    pf = NULL;//不置为空指针就会导致野指针
    return 0;
}

(3)文件的读写

IMG_0616

对于文件的读写,我们从作用相反的函数介绍开始:

(1)fgetc & fputc

如果你学习过 getc()、putc() 那么这两个文件读写函数的理解就简单很多了

image-20221009142836701

fputc()开始,你可以把这个函数的作用理解为把数据从内存一个一个地写入文件

int main()
{
    FILE *pf == fopen("test.txt","w");//写入操作,故是"w"
    fputc('a',pf);//写入一个字符'a'
    int i = 0;
    for(i=0;i<26;i++)
    {
        fputc('a' + i,pf);
    }//写入字母表
    fclose(pf);
    pf==NULL;
    return 0;
}
image-20221009142901609

再来看 fgetc() ,你可以把这个函数的作用理解为把数据从文件中一个一个地读出到内存

int main()
{
    //假设原先文件里存放着字母表,即 abcdefg...xyz
    FILE *pf == fopen("test.txt","r");//读操作,故是"r"
    int ch = fgetc(pf);//读取一个字符'a'
    int i = 0;
    for(i=0;i<25;i++)//已经读出过一个字符,所以再读25个就行
    {
        int ch = fgetc(pf);
    }//读出整个字母表
    ch = 0;
    while((ch=fgetc(pf)) != EOF)//判断是否到文件末尾
    {
        printf("%c ",ch);
    }//读取到文件末尾时会返回EOF,这点和 scanf()很相似
    fclose(pf);
    pf==NULL;
    return 0;
}

(2)fgets & fputs

功能和 fgetc()、fputc() 相似,只不过这俩是一行一行地进行操作

先来看fgets() ,特点很明显:可读数据长度有限制

image-20221009151313360
FILE *pf == fopen("test.txt","r");
char arr[] = "###################........####";//字符的多少决定了可读取数据的最大长度
fgets(arr,20,pf);//每次一行,可以规定读取数据的长度
printf("%s",pf);

再来看 fputs() ,这个的理解就简单很多

image-20221009151340591
//...
fputs("hello\n world\n",pf);
//...

(3)fscanf() & fprintf()

这两个函数负责的读写功能与结构体有紧密的关系,也不是很难理解

struct S
{
    char name;
    int age;
    float score;
};
//读取操作
int main()
{
    struct S s ={0};
    FILE *pf =fopen("test.txt","r");
    if(pf == NULL)
    {
        perror("fopen");
        return 1;
    }
    fscanf(pf,"%s %d %f",s.name,&(s.age),&(s.score));
    printf("%s %d %f",s.name,s.age,s.score);
    fclose(pf);
    pf==NULL;
    return 0;
}
//写入操作
/*int main()
{
    struct S s ={张三 16 95};
    FILE *pf =fopen("test.txt","w");
    if(pf == NULL)
    {
        perror("fopen");
        return 1;
    }
	scanf("%s %d %f",s.name,s.age,s.score);
    fclose(pf);
    pf==NULL;
    return 0;
}

(4)fread() & fwrite()

这两个函数功能是:二进制地读写

image-20221009153857511
//......
FILE *pf = fopen("test.txt","rb");//由于是二进制的读写,所以声明"rb"
//......
fread(&s,sizeof(s),1,pf);
//......
image-20221009153919031
 struct S s ={张三 16 95};
FILE *pf = fopen("test.txt","rw");
//...
fwrite(&s,sizeof(s),pf);

(4)简单补充知识

对于任何一个C语言程序,只要运行起来,就默认打开3个流:

  1. stdin - 标准输入流 - 键盘
  2. stdout - 标准输出流 - 屏幕
  3. stderr - 标准错误流 - 屏幕
  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值