新手c语言讲解及题目分享(十六)--文件系统专项练习

news2024/11/15 17:52:25

在我刚开始学习c语言的时候就跳过了这一章节,但在后面慢慢发现这一章节还是比较重要的,如果你报考了计算机二级c语言的话,你应该可以看到后面的三个大题有时会涉及到这章。所以说这章还是非常重要的。

目录

前言

一.打开文件

1.Fopen( )函数返回值

2.文件打开方式

二.关闭文件

三.以字符形式读写文件

1.Fgetc( )

2.Fputc( )

四.以字符串形式读写文件

1.fgets( )

2.fputs( )

五.以数据块形式读写文件

六.格式化读写文件

七.随机读写文件

八.题目分享

1.复制文件内容

2.统计文件中的字符数

3.列出目录中的所有文件

4.读取并显示文件内容

5.向文件中追加内容

6.创建新文件并写入数据

7.按行读取文件内容

8.删除文件中的特定行

9.文件重命名

10.文件大小

11.查找文件


前言

C 语言对文件有打开文件、读取和添加数据、插入和删除数据、关闭文件、删除文件等 操作。 与其他编程语言相比,C 语言文件操作的接口简单易学。在 C 语言中,为了统一对各种 硬件的操作,简化接口,不同的硬件设备也都被看成一个文件,其操作方法与普通文件的操 作方法类似。

废话不多说,直接开始正题。

一.打开文件

使用 头文件中的 fopen() 函数即可打开文件,它的用法为:

FILE *fopen(char *filename, char *mode);

filename 为文件名(包括文件路径),mode 为打开方式,它们都是字符串。

1.Fopen( )函数返回值

fopen 函数的返回值为 FILE 类型指针。如我们可以建立一个 FILE 型指针变量来存储 fopen 函数的返回值:

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

上面语句作用为用只读的方式打开文件 aaa.txt 并用 fp 指向该文件,以后就可以直接通过 操作 fp 来操作文件,fp 也称文件指针。

如果文件打开失败,fopen( )函数的返回值为 NULL

2.文件打开方式

打开方式说明
r只读方式打开文件,只能读文件的内容,不能写入,文件必须存在
w以写入方式打开文件,只允许写操作。文件不存在,则新建文件;若文件存在,则覆盖写入
a追加方式打开文件,在文件末尾写入数据。若文件不存在,则新建文件;若文件存在,则追加在文件末尾写入 (文件原内容保留)
r+读写方式打开文件,但文件必须存在,否则打开文件失败。
w+相当于 w 和 r+两者叠加,既可读也可写。若文件存在,则清空文件内容写入;若不存在则创建新文件
a+相当于 a 和 r+两者叠加,既可读也可写。若文件存在,则文件尾部追加写入(文件原内容保留);若不存在则创 建新文件。
t文本文件方式打开,若无 t 或 b 则默认为 t
b二进制文件方式打开

注:fopen()函数在使用时必须指明权限,但是读写方式可省略(t,b) 读写权限和读写方式可以组合使用,一般权限放在前面,读写方式放在后面。

二.关闭文件

文件使用完毕,必须关闭文件,以避免出现数据错误和丢失。 C 语言中使用 fclose( )函数实现文件关闭操作,当文件成功关闭时函数返回值为 0,若返 回非 0 值,则说明文件关闭发生错误。 Fclose 函数的用法为:

int fclose(File *fp);

fp 为文件指针。

三.以字符形式读写文件

C 语言中读写文件很灵活,每次可以以字符形式读写一个字符,也可以读写一个字符 串,还可以随意字节读写,本节主要介绍以字符形式读写文件。

字符形式读写主要用到两个函数:fgetc( )fputc( );

1.Fgetc( )

fgetc 全称为 file get character,即从文件读取一个字符,函数定义形式为:

int fgetc(FILE *fp)

fp 为文件指针。函数返回值为 fgetc 获取到的字符,若读到文件末尾或没有读取成功则 返回 EOF(end of file)。EOF 是 stdio 定义的一个宏值,值为-1。fgetc 函数的返回值类型定义 为 int 而不是 char 就是要容纳这个 EOF。

char ch; 
FILE *fp=fopen("a.txt","r+"); 
ch=fgetc(fp); 

上述代码表示从 a.txt 文件读取一个字符,并赋值给变量 ch。 在文件内部有一个专门记录文件读写位置的指针,在 fopen 打开文件时,该指针指向第 一个字节。使用 fgetc 函数读取文件后,该指针向后移动一个字节,这样再次调用 fgetc 函数 就可以继续读取下一个字符了。

EOF 有可能是其他负数,不一定是-1,要看编译器的实现。

2.Fputc( )

fputc 全称为 file put character,即从文件写入一个字符,函数定义形式为:

int fputc(int ch,FILE *fp)

ch 为要写入的字符,fp 为文件指针。函数返回值为 fputc 写入的字符,写入失败返回 EOF(end of file)EOF 是 stdio 定义的一个宏值为-1。之所以 fgetc 函数的返回值类型定义为 int 而不是 char 就是因为要容纳这个 EOF。

char ch='a'; 
fputc(ch,fp);

上述代码表示把字符 ch 写入到文件 fp。

四.以字符串形式读写文件

fgetc( )和 fputc( )函数每次向文件写入一个字符,但是实际开发往往要一次写入一个字符 串,因此需要用到字符串读写文件函数。

1.fgets( )

fgets( )全称为 file get string,即在指定文件读取字符串,它的函数定义为:

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

其中,str 为字符数组;n 为整数,代表要读取的字符个数;fp 为文件指针。该函数返回 值为字符数组首地址 str,读取失败和读到文件末尾都会返回 NULL。

2.fputs( )

fputs( )全称为 file put string,即向指定文件写入一个字符串,一般形式为:

int fputs(char *str, File *fp);

str 为要写入的字符串,pf 为文件指针。如写入成功则返回值为非负数,如失败则返回 EOF。

五.以数据块形式读写文件

在 C 语言中,读写文件不一定是以字符的形式,如要读写一个数组或一个结构体变量的  值时之前学习的读写方式就不适用了,需要用 fread( )和 fwrite( )函数来实现上述读写。对于 windows 操作系统,使用 fread( )和 fwrite( )函数要以二进制形式打开文件。

fread( )函数的一般形式为:

fread(buffer,size,count,fp);

fwrite( )函数的一般形式为:

fwrite(buffer,size,count,fp);

其中,buffer 为内存区块的指针,可以是数组、变量、结构体等。fread( )中的 buffer 用 于存放读取到的数据,fwrite( )中的 buffer 用于存放要写入的数据。 size 表示每个数据块的字节数;count 表示要读写的数据块的块数;fp 表示文件指针。 理论上每次读写 size*count 个字节的数据。

fread(fa,4,5,fp);

上述代码表示从 fp 指向的文件中,读取 4 个字节送入一个 fa 中,连续读 5 次,即读取 20 个字节。

六.格式化读写文件

文件读写要用到 fscanf()和 fprintf()函数。 函数一般形式为:

fscanf(FILE *fp,char *format,…);

fprintf(FILE *fp,char *format,…);

其中,fp 为文件指针,format 为格式控制字符串,…表示参数列表。与 scanf()和 printf() 相比,就多了一个文件指针参数 fp。fprintf()返回成功写入字符的个数,失败返回负数。 fscanf()返回参数列表成功赋值的参数个数。

七.随机读写文件

实现随机读写的关键是按需求移动文件指针,这个操作称为文件定位 可以利用 rewind()和 fseek()函数移动文件指针。 rewind()用来将位置指针移动到文件开头,一般形式为

rewind(FILE *fp); 此函数没有返回值。

fseek()用来移动文件指针到任意位置,一般形式为:

fseek(FILE *fp ,long offse,int origin); 

例如:要把文件指针移动到距离文件开头 200 个字节的地方:

fseek(fp,200,SEEK_SET); 

在文件指针移动好之后就可以进行文件读写了,由于使用二进制方式打开文件,所以常 用 fread()和 fwrite()函数来读写文件。

八.题目分享

1.复制文件内容

编写一个C程序,将一个文件的内容复制到另一个文件中。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fps, *fpt;
    char ch;

    // 打开源文件和目标文件
    fps = fopen("source.txt", "r");
    if (fps == NULL) {
        perror("无法打开源文件");
        exit(EXIT_FAILURE);
    }

    fpt = fopen("target.txt", "w");
    if (fpt == NULL) {
        perror("无法打开目标文件");
        fclose(fps); // 关闭已打开的源文件
        exit(EXIT_FAILURE);
    }

    // 读取源文件内容并写入目标文件
    while ((ch = fgetc(fps)) != EOF) {
        fputc(ch, fpt);
    }

    // 关闭文件
    fclose(fps);
    fclose(fpt);

    printf("文件复制成功!\n");

    return 0;
}

2.统计文件中的字符数

编写一个C程序,统计一个文本文件中的字符数。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    int count = 0;
    char ch;

    // 打开文件
    fp = fopen("example.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 读取字符并计数
    while ((ch = fgetc(fp)) != EOF) {
        count++;
    }

    // 关闭文件
    fclose(fp);

    printf("文件中的字符总数为:%d\n", count);

    return 0;
}

3.列出目录中的所有文件

编写一个C程序,列出指定目录中的所有文件。(仅适用于类Unix系统,包括Linux和macOS。在Windows系统上,你需要使用Windows API函数来列出目录中的文件。)

#include <stdio.h>
#include <dirent.h>

int main() {
    DIR *d;
    struct dirent *dir;

    d = opendir(".");
    if (d) {
        while ((dir = readdir(d)) != NULL) {
            printf("%s\n", dir->d_name);
        }
        closedir(d);
    }

    return 0;
}

4.读取并显示文件内容

编写一个C程序,读取一个文本文件的内容,并在控制台上显示。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    char ch;

    // 打开文件
    fp = fopen("content.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 读取并显示文件内容
    while ((ch = fgetc(fp)) != EOF) {
        putchar(ch);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

5.向文件中追加内容

编写一个C程序,向一个文本文件的末尾追加一行文本。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;

    // 打开文件用于追加内容
    fp = fopen("content.txt", "a");
    if (fp == NULL) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 向文件追加一行文本
    fprintf(fp, "\n这是追加的文本行。\n");

    // 关闭文件
    fclose(fp);

    printf("文本已成功追加到文件。\n");

    return 0;
}

6.创建新文件并写入数据

编写一个C程序,创建一个新的文本文件,并向其中写入一些初始数据。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;

    // 创建并打开新文件用于写入
    fp = fopen("newfile.txt", "w");
    if (fp == NULL) {
        perror("无法创建文件");
        exit(EXIT_FAILURE);
    }

    // 向文件写入数据
    fprintf(fp, "这是新文件的第一行。\n");
    fprintf(fp, "这是第二行。\n");

    // 关闭文件
    fclose(fp);

    printf("新文件已创建并写入数据。\n");

    return 0;
}

7.按行读取文件内容

编写一个C程序,按行读取一个文本文件的内容,并显示每一行的内容。

#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE_LENGTH 1024

int main() {
    FILE *fp;
    char line[MAX_LINE_LENGTH];

    // 打开文件
    fp = fopen("lines.txt", "r");
    if (fp == NULL) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 逐行读取文件内容
    while (fgets(line, MAX_LINE_LENGTH, fp) != NULL) {
        printf("%s", line);
    }

    // 关闭文件
    fclose(fp);

    return 0;
}

8.删除文件中的特定行

编写一个C程序,读取一个文本文件,删除文件中的特定行(例如,包含特定单词的行),并将结果保存到新文件中。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LINE_LENGTH 1024
#define TARGET_WORD "delete"

int main() {
    FILE *fps, *fpt;
    char line[MAX_LINE_LENGTH];

    // 打开源文件
    fps = fopen("source.txt", "r");
    if (fps == NULL) {
        perror("无法打开源文件");
        exit(EXIT_FAILURE);
    }

    // 打开目标文件用于写入
    fpt = fopen("target.txt", "w");
    if (fpt == NULL) {
        perror("无法打开目标文件");
        fclose(fps);
        exit(EXIT_FAILURE);
    }

    // 读取并处理每一行
    while (fgets(line, MAX_LINE_LENGTH, fps) != NULL) {
        if (strstr(line, TARGET_WORD) == NULL) {
            fputs(line, fpt); // 如果行不包含目标单词,则写入新文件
        }
    }

    // 关闭文件
    fclose(fps);
    fclose(fpt);

    printf("特定行已从文件中删除。\n");

    return 0;
}

9.文件重命名

编写一个C程序,实现文件的重命名功能。

#include <stdio.h>
#include <stdlib.h>

int main() {
    if (rename("oldname.txt", "newname.txt") == 0) {
        printf("文件重命名成功。\n");
    } else {
        perror("文件重命名失败");
        exit(EXIT_FAILURE);
    }

    return 0;
}

10.文件大小

编写一个C程序,计算并显示一个文件的大小(以字节为单位)。

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *fp;
    long size;

    // 打开文件
    fp = fopen("file.txt", "rb");
    if (fp == NULL) {
        perror("无法打开文件");
        exit(EXIT_FAILURE);
    }

    // 移动到文件末尾
    fseek(fp, 0, SEEK_END);

    // 获取文件大小
    size = ftell(fp);

    // 关闭文件
    fclose(fp);

    printf("文件大小为:%ld 字节\n", size);

    return 0;
}

11.查找文件

编写一个C程序,在当前目录中查找具有特定扩展名的所有文件。
 

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <string.h>

#define EXTENSION ".txt"

int main() {
    DIR *d;
    struct dirent *dir;
    char *ext;

    d = opendir(".");
    if (d) {
        while ((dir = readdir(d)) != NULL) {
            ext = strrchr(dir->d_name, '.'); // 获取文件扩展名
            if (ext && strcmp(ext, EXTENSION) == 0) {
                printf("%s\n", dir->d_name);
            }
        }
        closedir(d);
    }

    return 0;
}

————由于博主还是大三的在读生,时间有限,每天会不定时更新一些学习经验和一些32的项目,如果喜欢就点点关注吧,大佬们!!!!————

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108125.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keil发现Error: C9555E: Failed to check out a license

遇到这样的问题 解决办法&#xff1a; 换成这个版本 然后重新用keygen生成license

如何理解进程和线程之间的关系

目录 前言 一、进程和线程的关系 1、引入线程的原因 2、线程的特点 3、线程和进程的关系 二、如何在进程中创建线程 1、创建线程的函数 2、举例使用&#xff1a; 三、线程间的同步互斥机制 1、什么是同步互斥机制 2、如何在线程中使用同步互斥机制 3、实际举例 总结 前言 …

为什么要有RPC

​ 1. RPC&#xff08;Remote Procedure Call&#xff09; 定义&#xff1a; RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许程序在不同的地址空间&#xff08;通常是在网络上的不同机器&#xff09;之间调用函数或方法的机制。它使得…

代码随想录算法训练营Day03 | 链表理论基础、203.移除链表元素 、707.设计链表、206.反转链表

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 链表理论基础203.移除链表元素思路与重点 707.设计链表思路与重点 206.反转链表思路与重点 链表理论基础 C/C的定义链表节点方式&#xff1a; // 单链表 struct L…

vue part 8

浏览器本地存储 application&#xff0c; local storage中 js方法肯定会用很多呀&#xff0c;只是不直接操作dom了但是对对象和数组进行操作还是原先的方法&#xff0c;jq的话想用引入就可以了。我是直接放弃jq了&#xff0c;在框架中用jq包不好 sessionStorage.HTML <!…

Git+word记笔记

程序员记笔记主要同步很重要&#xff0c;我这个方法只支持个人笔记&#xff0c;如果团队还是用企业微信开个企业会员比较方便。为什么用word&#xff0c;因为可以镶嵌代码和文档&#xff0c;不仅仅是文字&#xff0c;兼容性强 语雀&#xff0c;云笔记这些对于上传的word都是有…

AI大模型编写多线程并发框架(六十五):发布和应用

系列文章目录 文章目录 系列文章目录前言一、项目背景二、第十三轮对话-优化传参三、第十四轮对话-释放资源四、完善所有单元测试五、验证通过六、发布七、参考文章 前言 在这个充满技术创新的时代&#xff0c;AI大模型正成为开发者们的新宠。它们可以帮助我们完成从简单的问答…

IA——网络操作设备VRP简介

一&#xff0c;VRP简介 二&#xff0c;网络设备的管理 &#xff08;1&#xff09;console口&#xff1a; &#xff08;2&#xff09;talnet: &#xff08;3&#xff09;SSH: 安全的远程登陆 &#xff08;4&#xff09;通过WEB页面登录&#xff1a; 三&#xff0c;命令行常见…

TikTok养号一般养几天?账号起步方法

TikTok养号是一个关键的步骤&#xff0c;它可以帮助新账号快速积累粉丝和观众&#xff0c;增加视频的曝光和互动率&#xff0c;从而提升账号的影响力和可见性。但是养号也并不是简单的登录账号、互动点赞&#xff0c;而是从底层设备到分发频率都需要讲究方法&#xff0c;否则号…

linux下c语言中的单向列表,双向链表,内核双向列表,及适用场景

1. 单向链表&#xff08;Singly Linked List&#xff09; 1.1 定义与结构 单向链表是链式存储结构中最简单的一种。它的每个节点包含两个部分&#xff1a; - 数据域&#xff1a;存储数据元素 - 指针域&#xff1a;存储指向下一个节点的指针 在单向链表中&#xff0c;节点通过…

OpenHarmony实战开发:@Watch装饰器:状态变量更改通知

往期鸿蒙全套实战精彩文章必看内容&#xff1a; 鸿蒙开发核心知识点&#xff0c;看这篇文章就够了 最新版&#xff01;鸿蒙HarmonyOS Next应用开发实战学习路线 鸿蒙HarmonyOS NEXT开发技术最全学习路线指南 鸿蒙应用开发实战项目&#xff0c;看这一篇文章就够了&#xff08…

为什么要做智慧厕所,智慧公厕的建设意义有哪些?@卓振思众

智慧厕所是利用物联网、大数据、人工智能等技术&#xff0c;对传统厕所进行智能化升级改造后的新型厕所。它具备环境监测与调控、厕位引导、资源管理、安全管理、数据分析与管理平台等功能和特点。卓振思众是智慧厕所源头厂家&#xff0c;建设智慧厕所主要有以下几个重要原因&a…

【python因果推断库7】使用 pymc 模型的工具变量建模 (IV)2

目录 与普通最小二乘法 (OLS) 的比较 应用理论&#xff1a;政治制度与GDP 拟合模型&#xff1a;贝叶斯方法 多变量结果和相关性度量 结论 与普通最小二乘法 (OLS) 的比较 simple_ols_reg sk_lin_reg().fit(X.reshape(-1, 1), y)print("Intercept:", simple_ols_…

V90总线伺服报800F错误

1、博途PLC工艺对象位置轴轴控功能块 博途PLC工艺对象位置轴轴控功能块(完整SCL代码)-CSDN博客文章浏览阅读423次。S7-1200PLC脉冲轴位置轴位置控制功能块S7-1200PLC脉冲轴位置轴位置控制功能块优化(完整SCL源代码)_s71200 脉冲轴-CSDN博客文章浏览阅读341次。该博客详细介绍了…

自闭症儿童语言干预

自闭症儿童的语言发展往往面临独特挑战&#xff0c;这不仅影响了他们的日常交流能力&#xff0c;也制约了其社交与认知的全面发展。因此&#xff0c;实施科学有效的语言干预对于促进自闭症儿童的语言能力至关重要。 语言干预应基于个性化原则&#xff0c;充分考虑每个孩子的兴…

基于echarts车辆大数据综合分析平台

0.序言 基于ECharts的大数据综合分析平台技术框架与基本原理 技术框架 基于ECharts的大数据综合分析平台是一个集数据收集、处理、分析及可视化展示于一体的综合性系统。其技术框架主要可以分为以下几个层次&#xff1a; 数据源层&#xff1a; 数据收集&#xff1a;通过各种…

STM32F407ZET6

GPIO SPI 串行外设接口(Serial Peripheral Interface)的简称也叫做SPI,是一种高速的、全双工同步通信的一种接口,串行外设接口一般是需要4根线来进行通信(NSS、MISO、MOSI、SCK),但是如果打算实现单向通信(最少3根线,NSS、MOSI、SCK),就可以利用这种机制实现一对多或…

八、发票校验(1)

第一节 发票知识 1、发票介绍 发票是指一切单位和个人在购销商品、提供或接受服务以及从事其他经营活动中&#xff0c;所开具和收取的业务凭证&#xff0c;是会计核算的原始依据&#xff0c;也是审计机关、税务机关执法检查的重要依据。 发票必须具备的要素是根据议定条件由…

Xilinx系FPGA学习笔记(四)VIO、ISSP(Altera)及串口学习

系列文章目录 文章目录 系列文章目录VIO&#xff08;Vivado&#xff09;ISSP&#xff08;Altera&#xff09;串口学习FPGA串口发送FPGA串口接收 VIO&#xff08;Vivado&#xff09; VIO 的全称叫 Virtual Input/Output&#xff0c;建立一个虚拟的输入/输出信号&#xff0c;可以…

CRE6959AM70V055S 超低待机功耗反激式开关电源芯片

CRE6959AM70V055S 是一款高度集成的电流型 PWM控制 IC&#xff0c;为高性能、低待机功率、低成本、高效率的隔离型反激式开关电源控制器。在满载时&#xff0c;CRE6959AM70V055S工作在固定频率(65kHz)模式。在负载较低时&#xff0c;CRE6959AM70V055S采用节能模式&#xff0c;实…