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

简介: 本文介绍了C语言中的文件操作,分为两个关卡。第1关任务是将键盘输入的字符(以#结束)存入`file1.txt`并显示输出;第2关任务是从键盘输入若干行文本(每行不超过80个字符,用-1作为结束标志),写入`file2.txt`后再读取并显示。文中详细讲解了文件的打开、读取(使用`fgetc()`和`fgets()`)、写入(使用`fputc()`和`fputs()`)及关闭操作,并提供了示例代码和测试说明。

目录😋

<第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;
}
image.gif

在上述例子中,"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;
}
image.gif

在该示例中,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;
}
image.gif

这里,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;
}
image.gif

在此处,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;
}
image.gif

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

  • 文件关闭操作

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

例如:

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

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

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

       在 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;
}
image.gif

在上述代码中:

  • 首先通过 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;
}

image.gif


测试结果

image.gif

<第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*********/
}
}

image.gif


测试结果

image.gif

image.gif

目录
相关文章
|
18小时前
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
32 23
|
18小时前
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
30 24
|
15小时前
|
存储 C++
【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】
本任务要求使用C++读取二进制文件并在每行前添加行号后输出到控制台。主要内容包括: 1. **任务描述**:用二进制方式打开指定文件,为每一行添加行号并输出。 2. **相关知识**: - 流类库中常用的类及其成员函数(如`iostream`、`fstream`等)。 - 标准输入输出及格式控制(如`cin`、`cout`和`iomanip`中的格式化函数)。 - 文件的应用方法(文本文件和二进制文件的读写操作)。 3. **编程要求**:编写程序,通过命令行参数传递文件名,使用`getline`读取数据并用`cout`输出带行号的内容。 4. **实验步骤**:参考实验指
15 5
|
15小时前
|
存储 编译器 C语言
【C语言程序设计——选择结构程序设计】求一元二次方程的根(头歌实践教学平台习题)【合集】
本任务要求根据求根公式计算并输出一元二次方程的两个实根,精确到小数点后两位。若方程无实根,则输出提示信息。主要内容包括: - **任务描述**:使用求根公式计算一元二次方程的实根。 - **相关知识**:掌握 `sqrt()` 函数的基本使用方法,判断方程是否有实根。 - **编程要求**:根据输入的系数,计算并输出方程的根或提示无实根。 - **测试说明**:提供两组测试数据及预期输出,确保代码正确性。 - **通关代码**:包含完整的 C 语言代码示例,实现上述功能。 通过本任务,你将学会如何处理一元二次方程的求解问题,并熟悉 `sqrt()` 函数的使用。
14 5
|
15小时前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
13 1
|
14小时前
|
小程序 C语言
【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
19 10
|
15小时前
|
C语言
【C语言程序设计——循环程序设计】鸡兔同笼问题(头歌实践教学平台习题)【合集】
本教程介绍了循环控制和跳转语句的使用,包括 `for`、`while` 和 `do-while` 循环,以及 `break` 和 `continue` 语句。通过示例代码详细讲解了这些语句的应用场景,并展示了如何使用循环嵌套解决复杂问题,如计算最大公因数和模拟游戏关卡选择。最后,通过鸡兔同笼问题演示了穷举法编程的实际应用。文中还提供了编程要求、测试说明及通关代码,帮助读者掌握相关知识并完成任务。 任务描述:根据给定条件,编写程序计算鸡和兔的数量。鸡有1个头2只脚,兔子有1个头4只脚。
19 5
|
16小时前
|
存储 算法 安全
【C语言程序设计——选择结构程序设计】求阶跃函数的值(头歌实践教学平台习题)【合集】
本任务要求输入x的值,计算并输出特定阶跃函数的结果。主要内容包括: 1. **选择结构基本概念**:介绍if、if-else、switch语句。 2. **主要语句类型**:详细解释if、if-else、switch语句的使用方法。 3. **跃迁函数中变量的取值范围**:说明如何根据条件判断变量范围。 4. **计算阶跃函数的值**:通过示例展示如何根据给定条件计算函数值。 编程要求:在右侧编辑器Begin-End之间补充代码,实现阶跃函数的计算和输出。测试说明提供了多个输入及其预期输出,确保代码正确性。最后提供通关代码和测试结果,帮助理解整个过程。
12 0
|
15小时前
|
存储 编译器 C语言
【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
本文档介绍了C语言环境配置和编程任务,主要内容包括: - **C语言环境配置**:详细讲解了在Windows系统上配置C语言开发环境的步骤。 - **第1关:程序改错**:包含任务描述、相关知识(如头文件引用、基本语法规则)、编程要求、测试说明及通关代码。 - **第2关:scanf函数**:涉及`scanf`和`printf`函数的格式与使用方法,提供编程要求、测试说明及通关代码。 文档结构清晰,涵盖从环境搭建到具体编程任务的完整流程,适合初学者学习和实践。
16 4
|
14小时前
|
C语言
【C语言程序设计——循环程序设计】统计海军鸣放礼炮声数量(头歌实践教学平台习题)【合集】
有A、B、C三艘军舰同时开始鸣放礼炮各21响。已知A舰每隔5秒1次,B舰每隔6秒放1次,C舰每隔7秒放1次。编程计算观众总共听到几次礼炮声。根据提示,在右侧编辑器Begin--End之间的区域内补充必要的代码。开始你的任务吧,祝你成功!
28 13

热门文章

最新文章

下一篇
开通oss服务