【C语言程序设计——文件】文件操作(头歌实践教学平台习题)【合集】

news/2025/1/7 21:49:20/

目录😋

<第1关:文件操作1> 

任务描述

相关知识

文件打开操作

文件读取操作

使用 fgetc() 函数读取单个字符:

使用 fgets() 函数读取一行字符:

文件写入操作

使用 fputc() 函数写入单个字符:

使用 fputs() 函数写入一行字符:

文件关闭操作

文件结束标记

编程要求

测试说明

通关代码

测试结果

<第2关:文件操作2> 

任务描述

相关知识

编程要求

测试说明

通关代码

测试结果


<第1关:文件操作1> 

任务描述

本关任务:将键盘输入的字符,以#代表结束,存入文件file1.txt中,并把存入的信息显示输出。

相关知识

为了完成本关任务,你需要掌握:

  1. 文件读写操作:使用文件指针 FILE *fp
  2. 文件结束标记:使用循环,判断是否读写到文件末尾,如while((str=fgetc(fp))!=EOF)

在 C 语言中,使用 fopen() 函数来打开一个文件,该函数返回一个 FILE* 类型的指针(即文件指针 fp),其函数原型为 FILE *fopen(const char *filename, const char *mode);

 

例如,以只读方式打开一个名为 test.txt 的文本文件,代码如下:

 
#include <stdio.h>
int main() {FILE *fp;fp = fopen("test.txt", "r");if (fp == NULL) {perror("Error opening file");return 1;}// 文件操作代码fclose(fp);return 0;
}
 

在上述例子中,"r" 是打开文件的模式,表示只读。若文件打开失败,fopen() 函数会返回 NULLperror() 函数用于打印错误信息,包含系统错误信息和自定义的错误提示(此处是 Error opening file)。

 

此外,其他常见的打开模式还有:

 
  • "w":只写模式。若文件不存在,则创建一个新文件;若文件已经存在,则截断文件(清空文件内容)。
  • "a":追加模式。若文件不存在,则创建一个新文件;若文件已经存在,则将写入的数据追加到文件末尾。
  • "r +":可读可写模式,文件必须存在。
  • "w +":可读可写模式。若文件不存在,则创建一个新文件;若文件已经存在,则截断文件
  • "a +":可读可写模式。若文件不存在,则创建一个新文件;若文件已经存在,则将写入的数据追加到文件末尾。

文件以可读模式(如 "r""r +""a +" 等)打开后,可使用 fgetc()fgets() 等函数来读取文件内容。

使用 fgetc() 函数读取单个字符:

以下是逐个字符读取文件内容并打印到控制台的示例代码:

#include <stdio.h>
int main() {FILE *fp;int c;fp = fopen("test.txt", "r");if (fp == NULL) {perror("Error opening file");return 1;}while ((c = fgetc(fp))!= EOF) {putchar(c);}fclose(fp);return 0;
}
 

在该示例中,fgetc(fp) 从文件指针 fp 所指向的文件中读取一个字符并返回。若读取到文件末尾,fgetc() 函数会返回 EOFEOF 是定义在 <stdio.h> 头文件中的常量,通常值为 -1),putchar(c) 函数用于将字符 c 输出到控制台。

使用 fgets() 函数读取一行字符:

示例代码如下:

#include <stdio.h>
int main() {FILE *fp;char buffer[100];fp = fopen("test.txt", "r");if (fp == NULL) {perror("Error opening file");return 1;}while (fgets(buffer, sizeof(buffer), fp)!= NULL) {printf("%s", buffer);}fclose(fp);return 0;
}
 

这里,fgets(buffer, sizeof(buffer), fp) 会从文件指针 fp 所指向的文件中读取一行字符(最多读取 sizeof(buffer)-1 个字符,因为 fgets() 会自动在读取的字符串末尾添加 '\0' 字符来表示字符串结束),并将其存储到 buffer 数组中。若读取到文件末尾,fgets() 函数会返回 NULL

文件以可写模式(如 "w""w +""a""a +" 等)打开后,可使用 fputc()fputs() 等函数来写入文件内容。

使用 fputc() 函数写入单个字符:

例如,以下代码将字符 'A' 写入一个名为 output.txt 的文件中:

#include <stdio.h>
int main() {FILE *fp;fp = fopen("output.txt", "w");if (fp == NULL) {perror("Error opening file");return 1;}fputc('A', fp);fclose(fp);return 0;
}
 

在此处,fputc('A', fp) 将字符 'A' 写入文件指针 fp 所指向的文件中。

使用 fputs() 函数写入一行字符:

示例代码如下:

#include <stdio.h>
int main() {FILE *fp;char str[] = "Hello, World!";fp = fopen("output.txt", "w");if (fp == NULL) {perror("Error opening file");return 1;}fputs(str, fp);fclose(fp);return 0;
}
 

这里,fputs(str, fp) 将字符串 str 写入文件指针 fp 所指向的文件中。与 fgets() 不同的是,fputs() 不会自动在字符串末尾添加换行符,若需要换行,可以在字符串中手动添加 '\n' 字符。

无论对文件进行了何种操作(读取、写入等),在使用完文件后,都应该使用 fclose() 函数关闭文件,其函数原型为 int fclose(FILE *stream);

 

例如:

FILE *fp;
fp = fopen("test.txt", "r");
// 文件操作
fclose(fp);
 

关闭文件有几个重要原因:

 
  • 首先,它可以释放文件相关的系统资源,例如文件描述符等。
  • 其次,确保文件的缓冲数据被正确地写入磁盘等存储设备。若不关闭文件,可能会导致数据丢失或文件损坏等问题。

        在 C 语言中,当对文件进行读取操作时,需要有一种机制来确定是否已经读到了文件的最后位置,也就是文件末尾。标准输入输出库提供了一个特殊的常量 EOF(End Of File,通常其值被定义为 -1)来作为文件结束的标记。

        像 fgetc() 函数,它从文件指针 fp 所指向的文件中每次读取一个字符,并返回该字符对应的 ASCII 码值(如果读取成功的话)。当它读到文件末尾时,就不再能获取到正常的字符数据了,此时它会返回 EOF 这个特殊的值,以此来告知程序已经到达文件的末尾了。

以下是一个使用 while((str=fgetc(fp))!=EOF) 循环来读取文件内容并进行处理的示例:

#include <stdio.h>int main() {FILE *fp;int str;  // 用于接收fgetc返回值,定义为int类型是因为EOF是一个特殊的整型值(通常为 -1)fp = fopen("test.txt", "r");  // 以只读方式打开名为test.txt的文件if (fp == NULL) {perror("Error opening file");return 1;}while ((str = fgetc(fp))!= EOF) {  // 循环读取文件,直到读到文件末尾(即fgetc返回EOF)putchar(str);  // 将读取到的字符输出显示,这里可以替换为其他对字符的处理逻辑,比如存储到数组等}fclose(fp);return 0;
}

在上述代码中:

 
  • 首先通过 fopen() 函数打开一个名为 test.txt 的文件,如果打开失败,会输出错误信息并结束程序。
  • 接着进入 while 循环,在循环条件 (str = fgetc(fp))!= EOF 中,先执行 str = fgetc(fp),这一步调用 fgetc() 函数从文件中读取一个字符,并把返回值(字符对应的 ASCII 码值或者 EOF)赋给 str,然后判断 str 是否等于 EOF。如果不等于 EOF,说明还没读到文件末尾,就会执行循环体里面的代码(这里是简单地用 putchar(str) 将字符输出到控制台,实际中可以根据需求进行更复杂的处理,比如统计字符个数、进行字符替换等操作)。一旦 fgetc() 返回了 EOF,循环就会结束,表示文件内容已经全部读取完毕。
  • 最后使用 fclose() 函数关闭文件,释放相关资源。

编程要求

根据提示,在右侧编辑器代码文件中的 Begin-End 区间内补充代码

测试说明

平台会对你编写的代码进行测试:

测试输入:

asdfghjkl#

预期输出:
asdfghjkl

开始你的任务吧,祝你成功!


通关代码

#include <stdio.h>
#include <stdlib.h>
int main( )
{FILE *fp;char str;if((fp=fopen("/data/workspace/myshixun/shiyan11/file1.txt",//请在此添加代码/******Begin********/"w"/******End*********/))==NULL) {printf("file cannot be opened\n");exit(1);					}//请在此添加代码/******Begin********/while((str = getchar())!='#'){fputc(str,fp);}/******End*********/fclose(fp);							if  ((fp=fopen("/data/workspace/myshixun/shiyan11/file1.txt",//请在此添加代码/******Begin********/"r"/******End*********/))==NULL)		{printf("file can not be opened\n");exit(1);					}//请在此添加代码/******Begin********/while((str = fgetc(fp)) != EOF){printf("%c",str);}/******End*********/fclose(fp);return 1;
}

测试结果

<第2关:文件操作2> 

任务描述

本关任务:编写一个小程序,实现从键盘上输入若干行文本(每行不超过80个字符),写入到文件file2.txt中,用-1作为字符串输入结束的标志,然后将文件的内容读出显示在屏幕上。

相关知识

为了完成本关任务,你需要掌握:(与第1关相同)

  1. 文件读写操作:使用文件指针 FILE *fp
  2. 输入结束的判断:由于这里输入的数据为字符串,需要使用字符串函数进行比较

编程要求

根据提示,在右侧编辑器代码文件中的 Begin-End 区间内补充代码。

测试说明

平台会对你编写的代码进行测试:

测试输入:

qwert
asdfgh
zx
-1

预期输出:
qwert
asdfgh
zx

开始你的任务吧,祝你成功!


通关代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>void WriteText(FILE *);
void ReadText(FILE *);
int main( )
{	FILE  *fp;if((fp=fopen("/data/workspace/myshixun/shiyan11/file2.txt","w"))==NULL){	printf("cannot open file"); exit(0);}WriteText(fp);fclose(fp);if((fp=fopen("/data/workspace/myshixun/shiyan11/file2.txt","r"))==NULL){	printf("cannot open file"); exit(0);}ReadText(fp);fclose(fp);
}void WriteText(FILE *fw) 												
{   char  str[81];//请在此添加代码/******Begin********/while(1){fgets(str,81,stdin);str[strcspn(str,"\n")]=0;if(strcmp(str,"-1")==0){break;}fprintf(fw,"%s\n",str);/******End*********/}
}void ReadText(FILE  *fr)
{	char str[81];//请在此添加代码/******Begin********/while(fgets(str,81,fr)!= NULL){printf("%s",str);/******End*********/
}
}

测试结果

在这里插入图片描述


http://www.ppmy.cn/news/1561379.html

相关文章

SSH网络终端的概述及使用指南

以下是5个常用的SSH网络终端的概述、功能特点、下载地址和使用方法&#xff1a; PuTTY 概述&#xff1a;PuTTY是一款开源的SSH和Telnet客户端&#xff0c;以其轻量级和便捷性而广受欢迎。功能特点&#xff1a;支持多种协议&#xff0c;包括SSH、Telnet、rlogin和原始TCP连接。提…

排序算法的实现(插入,希尔,选择,冒泡,堆排,快排)

目录 1.选择排序 2.冒泡排序 3.堆排序 4.插入排序 5.希尔排序 6.快排 6.1快排的优化 6.2快排&#xff08;双指针法&#xff09; 6.3快排&#xff08;非递归&#xff09; 7.归并排序 7.1归并非递归 8.计数排序 1.选择排序 对n个元素进行选择排序&#xff0c;我们可以…

原型模式详解与实践

在软件开发的奇妙世界里&#xff0c;我们常常面临重复创建相似对象的任务。如果每次创建都要从头开始设置各种属性和状态&#xff0c;不仅繁琐&#xff0c;还可能降低效率。原型模式就像一位神奇的魔法师&#xff0c;为我们提供了一种通过复制现有对象来创建新对象的优雅方式。…

C语言的正则表达式

C语言中的正则表达式 引言 正则表达式是一种用于描述字符串模式的工具&#xff0c;它可以用来进行字符串匹配、查找、替换等操作。在编程中&#xff0c;正则表达式被广泛应用于数据验证、信息提取等场景。C语言虽然没有内置的正则表达式支持&#xff0c;但通过一些库我们同样…

【C++笔记】红黑树(RBTree)深度剖析和AVL树的对比分析

【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】红黑树(RBTree)深度剖析和AVL树的对比分析前言一.红黑树的定义1.1 红黑树的概念1.2红黑树的规则1.3 红黑树对比A…

leetcode 2234. 花园的最大总美丽值

题目&#xff1a;2234. 花园的最大总美丽值 - 力扣&#xff08;LeetCode&#xff09; 1. 先对flowers进行升序排序&#xff0c;计算现有“完善花园”的数量minFull&#xff1b;如果没有&#xff0c;minFull为n。 2. 计算前缀和f[]。 3. 从i(minFull-1 to 0)枚举从第i个开始的…

《Opencv》基础操作详解(5)

接上篇&#xff1a;《Opencv》基础操作详解&#xff08;4&#xff09;-CSDN博客 目录 接上篇&#xff1a;《Opencv》基础操作详解&#xff08;4&#xff09;-CSDN博客 25、轮廓近似 简介 接口用法 参数说明 返回值 代码示例 结果展示 26、轮廓最小外接圆 简介 接口用…

(MTK平台mt8168)通过i2c调试外接MCU管理外接电源项目

这个项目是我几年前在mtk方案公司调试的一个比较具有综合性的项目,涉及到知识点有很多,我个人认为算是一个很经典的一个项目,当然这个是对技术人员而讲。我大概总结一下,涉及到i2c,kernel中的timer_list,示波器和逻辑分析仪的使用,还有i2c硬件上的原理,如果host断采用3…