C语言学习,这一篇就够了!(六)-- 文件操作

举报
阿童木 发表于 2021/08/18 07:34:02 2021/08/18
【摘要】 7. 文件的输入输出关于文件就不做过多的阐述,直接来写相关的操作 7.1 打开和关闭文件 7.1.1 打开文件用fopen来实现打开文件,调用方式为:fopen(文件名,使用文件方式);例如:fopen("a1","r)表示打开文件a1使用读入的方式。注意:fopen()函数会获取文件信息,包括文件名、文件状态、当前读写位置等,将这些信息保存到一个 FILE 结构体变量中,然后将该变量的地...

7. 文件的输入输出

关于文件就不做过多的阐述,直接来写相关的操作

7.1 打开和关闭文件

7.1.1 打开文件

fopen来实现打开文件,调用方式为:fopen(文件名,使用文件方式);

例如:fopen("a1","r)表示打开文件a1使用读入的方式。

注意:fopen()函数会获取文件信息,包括文件名、文件状态、当前读写位置等,将这些信息保存到一个 FILE 结构体变量中,然后将该变量的地址返回。

FILE是<stdio.h>头文件当中的一个结构体,所以可以直接使用

FILE *fp = fopen("demo.txt", "r");

判断是否打开成功

如果打开失败会返回一个空指针,因此可以通过返回的指针来判断文件是否打开成功

#include <stdio.h>
int main()
{
    FILE *fp = fopen("demo.txt", "r");
    if (fp == NULL)
    {
        printf("打开失败");
    }
    else
    {
        printf("打开成功");
    }
}

fopen函数的打开方式

~控制读写权限的字符~

打开方式 说明
“r” **以“只读”方式打开文件。**如果文件不存在,出错。
“w” **以“写入”方式打开文件。**如果文件不存在,那么创建一个新文件
“a” **以“追加”方式打开文件。**如果文件不存在,出错。
“r+” 以“读写”方式打开文件。如果文件不存在,出错。
“w+” 以“写入/更新”方式打开文件。如果文件不存在,建新文件。
“a+” 以“追加/更新”方式打开文件。如果文件不存在,出错。

~控制读写方式的字符~

打开方式 说明
“t” 文本文件。如果不写,默认为"t"
“b” 二进制文件。

读写权限和读写方式可以组合使用,读写方式要放在读写权限中间或尾部,例如:

  • 将读写方式放在读写权限的末尾:“rb”、“wt”、“ab”、“r+b”、“w+t”、“a+t”
  • 将读写方式放在读写权限的中间:“rb+”、“wt+”、“ab+”

从上面的字符中,我们可以知道文件打开方式由6个字符组成,它们的含义分别是:

  • r:读
  • w:写
  • a:追加
  • t:文本文件
  • b:二进制文件
  • +:读和写

7.1.2 关闭文件

在文件使用完毕之后,需要使用fclose函数把文件关闭,用法fclose(文件指针)

#include <stdio.h>
int main()
{
    FILE *fp = fopen("demo.txt", "r");
    if (fp == NULL)
    {
        printf("打开失败");
    }
    else
    {
        printf("打开成功");
    }
    // ...  操作文件
    // 关闭文件
    fclose(fp);
    return 0;
}

7.2 字符读写文件

字符读写文件主要用到了2个函数fgetcfputc,用法非常简单,当成api使用即可

7.2.1 fgetc读取文件

下面通过代码来实现读取当前目录下的demo.txt文件

#include <stdio.h>
int main()
{
    FILE *fp = fopen("demo.txt", "rt");
    char ch;
    //如果文件不存在,给出提示并退出
    if (fp == NULL)
    {
        printf("打开失败");
    }
    //每次读取一个字节,直到读取完毕
    while ((ch = fgetc(fp)) != EOF)
    {
        putchar(ch);
    }
    putchar('\n'); //输出换行符
    fclose(fp);
    return 0;
}

输出结果

image-20210613135224175

这正是我在demo.txt文件中写的内容,读取成功

重点:上面代码实现的关键是 while循环的条件(ch = fgetc(fp)) != EOFfgetc每次从位置指针所在的位置读取一个字符,保存到变量当中,然后指针后移一位,当到达文件末尾时,就无法读取字符了,于是返回EOF,over

这里也可以使用feof函数来判断是否到达文件结尾

7.2.2 fputc写入文件

写入文件采用fputc来实现,调用方式fputc(ch,fp)把字符ch写到文件指针变量fp所指向的文件中

#include <stdio.h>
int main()
{
    FILE *fp;
    char ch;
    //判断文件是否成功打开
    if ((fp = fopen("demo.txt", "wt+")) == NULL)
    {
        puts("打开失败");
    }
    printf("输入:\n");
    //每次从输入中读取一个字符并写入文件
    while ((ch = getchar()) != '\n')
    {
        fputc(ch, fp);//输出到文件内
    }
    fclose(fp);
    return 0;
}

7.3 字符串读写文件

在上面的字符读取文件方式中,一次只能读取一个字符,写也只能写一个,真的是超级慢,因此我们往往不会采用字符读取的方式

7.3.1 fgets读取文件

fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,使用方法:

char *fgets (char *str, int n, FILE *fp);

str 为字符数组,n 为要读取的字符数目,fp 为文件指针

注意:由于字符串的结尾会自动添加\0,所以如果希望读取100个字符,n应当取101

注意:在n-1个字符之前如果出现了换行,或者到了文件的末尾,则读取结束,因此只能读取一行数据

示例:使用fgets读取文件

#include <stdio.h>
#include <stdlib.h>
#define N 100 // 宏定义N = 100
int main()
{
    FILE *fp = fopen("demo.txt", "rt");
    char str[N + 1];
    if (fp == NULL)
    {
        printf("打开失败");
    }
    while (fgets(str, N, fp) != NULL)
    {
        printf("%s", str);
    }
    fclose(fp);
    return 0;
}

输出结果

image-20210613150256105

注意:fgets当遇到换行符时,也会一并读取,因此格式回和原文件相同,gets会忽略换行符

7.3.2 fputs写入文件

用法:int fputs(char *str,FILE *fp)

示例:向demo.txt文件中追加一句话

#include<stdio.h>
#include<string.h>
int main() {
    FILE *fp = fopen("demo.txt","at+");
    char attend[100];
    char str[102] = {0};
    if(fp == NULL) {
        printf("打开失败");
    }
    printf("输入一句话\n");
    gets(attend);
    strcat(str,"\n");
    strcat(str,attend);
    fputs(str,fp);
    fclose(fp);
    return 0;
}

输入输出结果

image-20210613152302858

读写文件部分就写这么多了,还有几种方式没有写,可以自己了解一下

结语

C语言复习的全部内容就在这里了,博主也是肝了几天才整理完,关于内容上有什么问题或者错误欢迎留言指出,好好学习,天天向上!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。