文件顺序读取--函数解析

news2025/1/19 3:13:04

fgetc和fputc 函数

fgetcfputc是C语言中用于文件操作的函数,分别用于从文件中读取字符和向文件中写入字符。以下是这两个函数的详细原型和说明:

fgetc函数原型

int fgetc(FILE *stream);

参数说明

  • FILE *stream:一个指向FILE对象的指针,该对象指定了一个文件流。这个流应该是已经打开的,以便进行读取。

返回值

  • 如果读取成功,返回读取的字符(以unsigned char强制转换为int的形式)。
  • 如果到达文件末尾或发生错误,返回EOF(通常定义为-1)。

fputc函数原型

int fputc(int character, FILE *stream);

参数说明

  • int character:需要写入的字符。虽然传入参数定义为int类型,实际上它只会使用该int参数的低8位,将其当作无符号字符来处理。
  • FILE *stream:要写入字符的文件流。可以是用标准库函数fopen打开的文件,也可以是类似stdinstdoutstderr之类的预定义文件流。

返回值

  • 如果写入成功,返回写入的字符(作为unsigned char类型转换为int类型)。
  • 如果写入失败,返回EOF(通常定义为-1)。

总结

  • fgetc函数用于从指定的文件流中读取下一个字符。
  • fputc函数用于将指定的字符写入到指定的文件流中。

这两个函数在处理文件时非常有用,可以单独使用或结合其他文件操作函数一起使用。它们通常用于处理二进制文件和文本文件。

简单应用

**题目:**打开一个名为"a.txt"的源文件以读取数据,然后打开(或创建)一个名为"b.txt"的目标文件以写入数据。

题目解析:

  1. 使用一个while循环,在循环中,使用fgetc函数从源文件中读取一个字符,并检查是否读取到了文件结束符(EOF)。如果没有读取到EOF,我们就使用fputc函数将该字符写入到目标文件中。
  2. 最后,我们关闭两个文件,并输出一条消息表示文件复制完成。

代码实现:

#include <stdio.h>  
#include <stdlib.h>  
int main() {  
    FILE *sourceFile, *targetFile;  
    char ch;  
  
    // 打开源文件  
    sourceFile = fopen("a.txt", "r");  
    if (sourceFile == NULL) {  
        perror("Error opening source file");  
        return EXIT_FAILURE;  
    }  
  
    // 打开目标文件(如果文件不存在,将创建它)  
    targetFile = fopen("b.txt", "w");  
    if (targetFile == NULL) {  
        perror("Error opening target file");  
        fclose(sourceFile); // 关闭已打开的源文件  
        return EXIT_FAILURE;  
    }  
  
    // 使用fgetc从源文件中读取字符,并使用fputc写入到目标文件中  
    while ((ch = fgetc(sourceFile)) != EOF) {  
        fputc(ch, targetFile);  
    }  
  
    // 关闭文件  
    fclose(sourceFile);  
    fclose(targetFile);  
  
    printf("File copy complete!\n");  
  
    return 0;  
}
a文件内容复制后b文件内容
在这里插入图片描述在这里插入图片描述

fgets和fputs函数

fgetsfputs是C语言中用于文件操作的函数,分别用于从文件中读取一行字符串和向文件中写入一个字符串。以下是这两个函数的详细原型和说明:

fgets函数原型

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

参数说明

  1. char *str:指向一个字符数组的指针,用于存储从文件读取的字符串。
  2. int n:要读取的最大字符数(包括最后的空字符\0)。
  3. FILE *stream:指向FILE对象的指针,标识了要从中读取字符的文件流。

返回值

  • 如果成功,返回指向读取的字符串的指针(即str参数的值)。
  • 如果到达文件末尾或发生错误,返回NULL

fputs函数原型

int fputs(const char *s, FILE *stream);

参数说明

  1. const char *s:指向要写入的字符串的指针。
  2. FILE *stream:指向FILE对象的指针,指定了要将字符串写入的文件流。

返回值

  • 如果成功,返回非负整数。
  • 如果发生错误,返回EOF(一个定义在stdio.h中的特殊值,通常为-1)。

总结

  • fgets函数用于从指定的文件流中读取一行字符串,直到遇到换行符、文件结束或读取了n-1个字符。
  • fputs函数用于将一个字符串写入到指定的文件流中,不包括字符串的终止空字符\0

这两个函数在处理文本文件时特别有用,fgets常用于按行读取文本内容,而fputs则用于将字符串写入文件。注意,使用这两个函数时应确保文件流已正确打开,且在使用完毕后应关闭文件流以避免资源泄漏。

简单应用

题目:使用fgets函数从文件aa.txt中读取内容,并使用fputs函数将内容写入另一个文件bb.txt中。

题目解析:

  1. 首先定义了源文件和目标文件的文件名(这里分别为"aa.txt"和"bb.txt"),然后定义了一个用于暂存读取内容的字符数组buffer,并指定了其大小为1024字节。
  2. 接着,我们使用fopen函数以只读模式(“r”)打开源文件,并以写入模式(“w”)打开目标文件。如果文件打开失败,程序将输出错误消息并退出。
  3. 然后,我们使用fgets函数从源文件中读取内容到buffer中,并使用fputs函数将内容写入到目标文件中。这个操作在一个循环中进行,直到源文件的所有内容都被读取并写入到目标文件中。
  4. 最后,我们使用fclose函数关闭源文件和目标文件,并输出一条消息表示文件复制完成。
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#define BUFFER_SIZE 1024 // 缓冲区大小  
  
int main() {  
    FILE *sourceFile, *targetFile;  
    char buffer[BUFFER_SIZE];   
  
    // 打开源文件  
    sourceFile = fopen("aa.txt", "r");  
    if (sourceFile == NULL) {  //打开失败判断
        perror("Error opening source file");  
        return EXIT_FAILURE;  
    }  
  
    // 打开目标文件(如果文件不存在,将创建它)  
    targetFile = fopen("bb.txt", "w");  
    if (targetFile == NULL) {  
        perror("Error opening target file");  
        fclose(sourceFile); // 关闭已打开的源文件  
        return EXIT_FAILURE;  
    }  
  
    // 使用fgets循环读取源文件内容存放在buffer数组中  
    while ((fgets(buffer, BUFFER_SIZE, sourceFile)) != NULL) {  
        // 使用fputs将读取的内容(即buffer的内容)写入目标文件  
        fputs(buffer, targetFile);  
    }  
  
    // 关闭文件  
    fclose(sourceFile);  
    fclose(targetFile);  
  
    printf("File copy complete!\n");  
  
    return 0;  
}

运行结果:

aa.txt原来的内容复制后bb.txt的内容
在这里插入图片描述在这里插入图片描述

fread 和fwrite 函数

freadfwrite是C语言中用于文件操作的重要函数,它们分别用于从文件中读取数据块和向文件中写入数据块。以下是这两个函数的详细原型和说明:

fread 函数原型

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

参数说明

  1. void *ptr:这是一个指向内存空间的指针,该内存空间用于储存从文件中读取的数据块。由于ptrvoid *类型,它可以指向任何数据类型。
  2. size_t size:这指定了每个从文件读取的数据项的字节大小。size_t是一个无符号整数类型,通常用于表示对象的大小。
  3. size_t count:这指定了从文件读取的数据项的个数。
  4. FILE *stream:这是一个指向FILE类型结构的指针,它指定了fread函数要读取的文件流,该值通常是fopen函数的返回值。

返回值

  • 如果成功,fread函数返回实际读取的数据项个数(以size_t类型返回)。
  • 如果读取到文件末尾或发生错误,返回值可能小于count

fwrite 函数原型

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

参数说明

  1. const void *ptr:这是一个指向内存空间的指针,该内存空间中储存有待写入文件的数据块。由于ptrconst void *类型,它可以指向任何数据类型的常量。
  2. size_t size:这指定了每个待写入文件的数据项的字节大小。
  3. size_t count:这指定了待写入文件的数据项的个数。
  4. FILE *stream:这是一个指向FILE类型结构的指针,它指定了fwrite函数要写入的文件流。

返回值

  • 如果成功,fwrite函数返回实际写入的数据项个数(以size_t类型返回)。
  • 如果写入过程中发生错误,返回值可能小于count

总结

  • freadfwrite函数都用于处理二进制文件,可以读写任意类型的数据。
  • 这两个函数都使用size_t类型来表示数据项的大小和数量,确保可以处理大文件。
  • 在使用这两个函数时,需要注意文件指针stream必须已经被正确打开,并且具有适当的读写权限。
  • 这两个函数都是块操作,比逐个字符操作的fgetcfputc函数在处理大文件时更加高效。

函数应用

若使用同样的案例,那么只要修改代码为

#include <stdio.h>  
#include <stdlib.h>  
  
#define BUFFER_SIZE 1024 // 缓冲区大小  
  
int main() {  
    FILE *sourceFile, *targetFile;  
    char buffer[BUFFER_SIZE];  
    size_t bytesRead;  
  
    // 打开源文件  
    sourceFile = fopen("aa.txt", "rb"); // 使用二进制模式读取  
    if (sourceFile == NULL) {  
        perror("Error opening source file");  
        return EXIT_FAILURE;  
    }  
  
    // 打开目标文件(如果文件不存在,将创建它)  
    targetFile = fopen("bb.txt", "wb"); // 使用二进制模式写入  
    if (targetFile == NULL) {  
        perror("Error opening target file");  
        fclose(sourceFile); // 关闭已打开的源文件  
        return EXIT_FAILURE;  
    }  
  
    // 使用fread从源文件中读取数据块,并使用fwrite写入到目标文件中  
    while ((bytesRead = fread(buffer, sizeof(char), BUFFER_SIZE, sourceFile)) > 0) {  
        fwrite(buffer, sizeof(char), bytesRead, targetFile);  
    }  
  
    // 关闭文件  
    fclose(sourceFile);  
    fclose(targetFile);  
  
    printf("File copy complete!\n");  
  
    return EXIT_SUCCESS;  
}

注意,这里我们使用了二进制模式(“rb"和"wb”)来打开文件,这允许我们处理任何类型的数据,包括文本和二进制数据。

fscanf和fprintf函数

fscanffprintf是C语言中用于文件操作的重要函数,分别用于从文件中读取格式化的输入和向文件中写入格式化的输出。以下是这两个函数的详细原型和说明:

fscanf 函数原型

int fscanf(FILE *stream, const char *format, ...);

参数说明

  1. FILE *stream:这是一个指向FILE对象的指针,该对象标识了要从中读取数据的文件流。
  2. const char *format:这是一个C字符串,包含了要被读取的数据的格式。这个字符串可以包含普通字符(这些字符会被简单地复制到输出流中)和格式控制符(这些字符指定了如何从输入流中读取和解释数据)。
  3. ...:这是一个可变参数列表,包含了指向要存储读取数据的变量的指针。这些变量的类型和数量由format字符串中的格式控制符决定。

返回值

  • 如果成功,fscanf函数返回成功读取并赋值的参数数量
  • 如果在读取过程中遇到文件结束或发生错误,则返回EOF(通常定义为-1)。

fprintf 函数原型

int fprintf(FILE *stream, const char *format, ...);

参数说明

  1. FILE *stream:这是一个指向FILE对象的指针,该对象标识了要将数据写入其中的文件流。
  2. const char *format:这是一个C字符串,包含了要被写入到流stream中的文本。它可以包含嵌入的格式标签,这些标签会被随后的附加参数中指定的值替换,并按需进行格式化。
  3. ...:这是一个可变参数列表,包含了要写入文件的数据。这些数据的类型和数量由format字符串中的格式控制符决定。

返回值

  • 如果成功,fprintf函数返回写入的字符数(不包括字符串结束符\0)。
  • 如果发生错误,返回一个负值。

总结

  • fscanffprintf函数都使用FILE指针来指定操作的文件流。
  • 这两个函数都接受一个格式字符串,该字符串定义了如何读取或写入数据。
  • 这两个函数都接受可变数量的参数,这些参数的类型和数量由格式字符串中的格式控制符决定。
  • fscanf用于从文件中读取格式化的数据,而fprintf用于向文件中写入格式化的数据。

注意:这两个函数在处理文件时都依赖于文件的当前位置。如果你需要从文件的特定位置开始读取或写入,你需要使用fseek函数来设置文件的位置指针。

应用示例

学生成绩管理系统

项目描述:

这个简单的项目将模拟一个学生成绩管理系统的部分功能。它从一个名为input.txt的文本文件中读取学生的姓名和成绩,然后输出每个学生的姓名和成绩到控制台。之后,它将这些信息写入到另一个名为output.txt的文本文件中。

文本文件(input.txt)格式:

张三 90  
李四 85  
王五 92  
赵六 78

每行包含学生的姓名和成绩,用空格分隔。

在这里插入图片描述

代码实现:

#include <stdio.h>  
#include <stdlib.h>  
  
#define MAX_LINE_LENGTH 100  
  
int main() {  
    FILE *inputFile, *outputFile;  
    char line[MAX_LINE_LENGTH];  
    char name[50];  
    int score;  
  
    // 打开输入文件  
    inputFile = fopen("input.txt", "r");  
    if (inputFile == NULL) {  
        printf("Error opening input file");  //或者perror
        return 1;  
    }  
  
    // 打开输出文件  
    outputFile = fopen("output.txt", "w");  
    if (outputFile == NULL) {  
        printf("Error opening output file");  
        fclose(inputFile); // 不要忘记关闭已打开的文件  
        return 1;  
    }  
  
    // 读取并处理文件内容  
    while (fscanf(inputFile, "%49s %d", name, &score) == 2) {  
        // 在控制台输出学生姓名和成绩  
        printf("Name: %s, Score: %d\n", name, score);  
  
        // 将学生姓名和成绩写入到输出文件  
        fprintf(outputFile, "Name: %s, Score: %d\n", name, score);  
    }  
  
    // 关闭文件  
    fclose(inputFile);  
    fclose(outputFile);  
  
    printf("Data processing completed successfully.\n");  
  
    return 0;  
}

运行后:output.txt中的文本内容

在这里插入图片描述

注意事项:

  1. 在使用fscanf时,我们指定了%49s来读取学生的姓名,这是为了防止输入过长导致缓冲区溢出。49是因为我们为name数组预留了一个位置给字符串结束符\0

  2. 我们检查fscanf的返回值是否为2,以确保我们成功读取了一个姓名和一个成绩。

  3. 使用printf(或perror)函数来输出打开文件时发生的错误。

  4. 始终在不再需要文件时关闭它,以避免资源泄露。
    fclose(inputFile);
    fclose(outputFile);

  5. 考虑到错误处理,如果无法打开文件,则程序会输出一个错误消息并返回非零值。

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

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

相关文章

【Linux系列】find命令使用与用法详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

淘酒屋荣获2024中法贸易杰出服务商称号暨夏季窖主大会圆满召开

淘酒屋荣获中法贸易杰出服务商称号&#xff0c;暨闪光的创始人2024夏季窖主大会圆满召开 2024年&#xff0c;作为中法建交60周年的重要节点&#xff0c;同时迎来了中法文化旅游年&#xff0c;这为两国文化交流与合作开启了新的篇章。在庆祝中法贸易交流的重要时刻&#xff0c;…

Java——集合(一)

前言: Collection集合&#xff0c;List集合 文章目录 一、Collection 集合1.1 集合和数组的区别1.2 集合框架1.3 Collection 集合常用方法1.4 Collction 集合的遍历 二、List 集合2.1 List 概述2.2 List集合的五种遍历方式2.3 List集合的实现类 一、Collection 集合 1.1 集合和…

ubuntu 18.04 server源码编译安装freeswitch 1.10.11——筑梦之路

前言 这里主要编译支持语音通话、视频通话、短信、webrtc功能的PBX。 安装编译工具包和依赖包 sudo apt-get updatesudo apt-get install -y autoconf git libtool g zlib1g-dev libjpeg-dev libcurl4-openssl-dev libspeex-dev libldns-dev libedit-dev libssl-dev pkg-con…

学校报修管理系统

摘 要 随着社会的发展和技术的进步&#xff0c;学校报修管理系统在学校设备维修工作中扮演着至关重要的角色。该系统的设计和实现对于提高学校设备维修效率、优化资源管理、提升用户体验具有重要意义。本论文基于SpringBoot框架&#xff0c;设计并实现了一套学校报修管理系统。…

DWG转PDF字体研究记录

1.前言 最近需要对PDF中的符合业务规则的文字进行提取&#xff0c;发现有些文字不是文字信息形式存储&#xff0c;而是polyline形式表达&#xff0c;意味着仅仅有形体上的表达&#xff0c;丢失了原本的文字信息。 经过沟通得知&#xff0c;这些PDF是AutoCAD软件导出的&#xf…

2-3KW户储、家储逆变器设计资料

储能电源方案双向逆变器板资料&#xff0c;原理文件&#xff0c;PCB文件&#xff0c;源代码&#xff0c;bom清单。 bom表&#xff1a; PCB&#xff1a; 变压器电感 2-3KW户储、家储逆变器设计通常需要考虑以下几个方面&#xff1a; 输入电压范围&#xff1a;逆变器需要能够适应…

数据库新技术【分布式数据库】

文章目录 第一章 概述1.1 基本概念1.1.1 分布式数据库1.1.2 数据管理的透明性1.1.3 可靠性1.1.4 分布式数据库与集中式数据库的区别 1.2 体系结构1.3 全局目录1.4 关系代数1.4.1 基操1.4.2 关系表达式1.4.3 查询树 第二章 分布式数据库的设计2.1 设计策略2.2 分布设计的目标2.3…

Apriori 处理ALLElectronics事务数据

通过Apriori算法挖掘以下事务集合的频繁项集&#xff1a; 流程图 代码 # 导入必要的库 from itertools import combinations# 定义Apriori算法函数 def apriori(transactions, min_support, min_confidence):# 遍历数据&#xff0c;统计每个项的支持度 item_support {}for tr…

数学建模---包汤圆问题引发的思考

1.前言 &#xff08;1&#xff09;虽然我学习这个数学建模已经很长一段时间了&#xff0c;但是我认为自己始终是一个门外汉&#xff0c;只是学习了一下这个基本的建模软件使用方法&#xff0c;以及一些相关的知识&#xff0c;虽然参加了一次这个电工杯的比赛&#xff0c;但是这…

编译——链接

在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境&#xff1a; 第一种就是编译环境&#xff0c;在这个环境中源代码被转换成可执行的机器指令&#xff08;二进制指令&#xff09; 第二种是执行环境&#xff0c;它用于实现执行代码 翻译环境 其实翻译环境就是指编译和链…

数据结构和算法(2)---- Stack 的原理和实现

Stack 的定义和结构 栈(Stack)是仅限于在表尾进行插入和删除的线性表 我们把允许插入和删除的一端称为栈顶(top)&#xff0c;另一端称为栈底(bottom)&#xff0c;不含任何元素的栈称为空栈&#xff0c;栈也被称为先进后出(Last In First Out)的线性表&#xff0c;简称LIFO结构…

RabbitMQ消息队列 安装及基本介绍

一.MQ介绍 Message Queue &#xff08;MQ&#xff09;是一种跨进程的通信机制&#xff0c;用于在系统之间进行传递消息。MQ作为消息中间件&#xff0c;可以进行异步处理请求&#xff0c;从而减少请求响应时间和解耦 1.1 应用场景 1.1.1 系统之间通过MQ进行消息通信&#xff0…

如何给MySQL设置远程访问?(官方校正版)

在现代数据驱动的世界中&#xff0c;数据库的灵活性和可访问性变得尤为重要。设置MySQL的远程访问不仅仅是为了方便&#xff0c;还为企业和开发者提供了多种优势。无论是在分布式团队协作、跨地域数据管理&#xff0c;还是在系统集成和实时数据访问方面&#xff0c;远程访问都能…

荣耀社招 测试工程师 技术一面

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、自我介绍 2、具体介绍做过的项目&#xff0c;支撑的事什么业务 3、防火墙测试时、平时有写脚本或者使用第三方工具吗 4、对互联网的安全测试规…

网络知识 思维导图

计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。今天整理了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。建议你收藏起来慢慢看&#xff0c;在看过之后最好能重新动手画一画&#xff0c;让计算机网…

图的学习.

目录 一、图的基本概念 1.1图的种类 1.2顶点的度、入度和出度 1.3边的权和网 1.4路径、路径长度和回路 二、图的存储结构 2.1邻接矩阵法 2.2邻接表法 2.3十字链表 2.4邻接多重表 三、图的遍历 3.1广度优先搜索 3.2深度优先搜索 四、图的应用 4.1最小生成树 4.1.…

音视频开发29 FFmpeg 音频编码- 流程以及重要API,该章节使用AAC编码说明

此章节的一些参数&#xff0c;需要先掌握aac的一些基本知识&#xff1a;​​​​​​aac音视频开发13 FFmpeg 音频 --- 常用音频格式AAC&#xff0c;AAC编码器&#xff0c; AAC ADTS格式 。_ffmpeg aac data数据格式-CSDN博客 目的&#xff1a; 从本地⽂件读取PCM数据进⾏AAC格…

mysql启动时遇到:本地计算机上的MySQL服务启动后停止

1.问题重述&#xff1a; 今早启动数据库时发现无法启动&#xff0c;报错&#xff1a;本地计算机 上的 MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止。 2.解决方案&#xff1a; 1.数据备份&#xff1a; 2.在bin目录下&#xff0c;命令行中输入 mysqld …

1.3 Sqoop 数据同步工具详细教程

Apache Sqoop 是一个开源工具&#xff0c;用于在 Apache Hadoop 和关系型数据库&#xff08;如 MySQL、Oracle、PostgreSQL 等&#xff09;之间高效传输数据。Sqoop 可以将结构化数据从关系型数据库导入到 Hadoop 的 HDFS、Hive 和 HBase 中&#xff0c;也可以将数据从 Hadoop …