【C语言】文件操作(二)

在这里插入图片描述

前言
在文件操作(一)中我们了解了文件及文件指针,还有文件的打开和关闭。在这篇博客我们学习顺序读写文件的几个函数。


文章目录

  • 一、文件的顺序读写
  • 1.1 顺序读写函数介绍
    • fgetc 字符输入函数
    • fputc 字符输出函数
    • fgets 文本行输入函数
    • fputs 文本行输出函数
    • fread —二进制输入 fwrite —二进制输入
  • 1.2 比较一些函数

一、文件的顺序读写

1.1 顺序读写函数介绍

函数名功能适用于
fgetc字符输⼊函数所有输⼊流
fputc字符输出函数所有输出流
fgets⽂本⾏输⼊函数所有输⼊流
fputs⽂本⾏输出函数所有输出流
fscanf格式化输⼊函数所有输⼊流
fprintf格式化输出函数所有输出流
fread⼆进制输⼊⽂件
fwrite⼆进制输出⽂件

fgetc 字符输入函数

int fgetc(FILE *stream)
参数——stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。返回值——该函数以无符号 char 强制转换为 int 的形式返回读取的字符(整数代表从文件流中读取的下一个字符的字符编码值),如果到达文件末尾或发生读错误,则返回 EOF

实例:

#include <stdio.h>int main() {// 打开文件以供读取FILE *file = fopen("example.txt", "r");//"r"不会自动创建文件,需要我们自己在创建if (file == NULL) {perror("无法打开文件");return 1;}int character;// 使用 fgetc 逐字符读取文件内容while ((character = fgetc(file)) != EOF) {// 打印读取的字符putchar(character);}// 关闭文件fclose(file);return 0;
}

创建文本文档:
在这里插入图片描述
运行结果:
在这里插入图片描述


fputc 字符输出函数

int fputc(int char, FILE *stream)
参数——char -- 这是要被写入的字符。该字符以其对应的 int 值进行传递。stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。返回值——如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

实例:

#include <stdio.h>int main() {// 打开文件以供写入FILE *file = fopen("output.txt", "w");//"w"如果没有output.txt文件,建⽴⼀个新的⽂件if (file == NULL) {perror("无法打开文件");return 1;}// 要写入文件的字符char character = 'A';// 使用 fputc 将字符写入文件if (fputc(character, file) == EOF) {perror("写入文件时出错");return 1;}// 关闭文件fclose(file);return 0;
}

运行结果:
在这里插入图片描述


fgets 文本行输入函数

char *fgets(char *str, int n, FILE *stream)
参数——str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。返回值——如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。

实例:

#include <stdio.h>int main() {// 打开文件以供读取FILE* file = fopen("example.txt", "r");if (file == NULL) {perror("无法打开文件");return 1;}// 字符数组用于存储读取的文本行char buffer[13];// 使用 fgets 从文件中读取一行文本while (fgets(buffer, sizeof(buffer), file) != NULL) {// 打印读取的文本行printf("%s", buffer);} // 关闭文件fclose(file);return 0;
}

创建文本文档:
在这里插入图片描述
运行结果:
在这里插入图片描述


fputs 文本行输出函数

int fputs(const char *str, FILE *stream)
参数——str -- 这是一个数组,包含了要写入的以空字符终止的字符序列。stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。返回值——该函数返回一个非负值,如果发生错误则返回 EOF

实例:

#include <stdio.h>int main() {// 打开文件以供写入FILE *file = fopen("output.txt", "w");if (file == NULL) {perror("无法打开文件");return 1;}// 要写入文件的字符串const char *text = "Hello, World!";// 使用 fputs 将字符串写入文件if (fputs(text, file) == EOF) {perror("写入文件时出错");return 1;}// 关闭文件fclose(file);return 0;
}

运行结果:
在这里插入图片描述


fread —二进制输入 fwrite —二进制输入

//fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
参数——ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。size -- 这是要读取的每个元素的大小,以字节为单位。nmemb -- 这是元素的个数,每个元素的大小为 size 字节。stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。返回值——成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。
//fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数——ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。size -- 这是要读取的每个元素的大小,以字节为单位。nmemb -- 这是元素的个数,每个元素的大小为 size 字节。stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值——如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误

实例:

//首先使用fwrite写入二进制数据,然后用fread读出
#include <stdio.h>int main() {// 创建一个包含二进制数据的数组int data_to_write[5] = { 1, 2, 3, 4, 5 };// 打开一个二进制文件以供写入FILE* file_write = fopen("binary_data.bin", "wb");if (file_write == NULL) {perror("无法打开文件");return 1;}// 使用 fwrite 写入二进制数据到文件size_t elements_written = fwrite(data_to_write, sizeof(int), 5, file_write);if (elements_written < 5) {perror("写入文件时出错");fclose(file_write);return 1;}// 关闭文件fclose(file_write);// 打开同一个二进制文件以供读取FILE* file_read = fopen("binary_data.bin", "rb");if (file_read == NULL) {perror("无法打开文件");return 1;}// 从文件中读取二进制数据int data_read[5];size_t elements_read = fread(data_read, sizeof(int), 5, file_read);if (elements_read < 5) {perror("读取文件时出错");fclose(file_read);return 1;}// 关闭文件fclose(file_read);// 打印读取的数据printf("读取的数据:");for (size_t i = 0; i < elements_read; i++) {printf("%d ", data_read[i]);}printf("\n");return 0;
}

运行结果:
在这里插入图片描述
二进制文件:
在这里插入图片描述


1.2 比较一些函数

输入函数功能函数声明
scanf从标准输入(通常是键盘)读取格式化输入*int scanf(const char format, …);
fscanf从文件流中读取格式化输入int fscanf(FILE *stream, const char *format, …);
sscanf从字符串中读取格式化输入int sscanf(const char *str, const char *format, …);
输入函数功能函数声明
printf将格式化的输出写入到标准输出(通常是终端屏幕)int printf(const char *format, …);
fprintf将格式化的输出写入到文件流int fprintf(FILE *stream, const char *format, …);
sprintf将格式化的输出写入到字符串int sprintf(char *str, const char *format, …);

可以看到,fscanf 和 sscanf 与 fprintf 和 sprintf ,跟scanf 和 sprintf 的使用是相似的,唯一不同的是,它们输入和输出函数从不同的源(标准输入、文件、字符串)读取数据,或将数据输出到不同的目标(标准输出、文件、字符串)。
实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main() {int num;char name[20];FILE* file;// 输入函数示例printf("请输入一个整数:");scanf("%d", &num); // 从标准输入读取整数,并放入numfile = fopen("input.txt", "r");if (file != NULL) {// 从文件中读取一个字符串,并放入name(提前创建input.txt,并将"Hello,"保存在文件中)fscanf(file, "%s", name); fclose(file);}char input_string[] = "John";// 从字符串中解析整数和字符串,//已经在input.txt中读取了字符串"Hello,"并放在了name中//需要在name加上6个偏移量处读取input_string字符串,防止字符串被覆盖sscanf(input_string, "%s", name + 6);// 输出函数示例printf("整数:%d\n", num); // 输出到标准输出,预期结果  整数:20file = fopen("output.txt", "w");if (file != NULL) {fprintf(file, "整数:%d\n", num); // 输出到文件output.txt,预期结果  整数:20fclose(file);}char output_string[50];sprintf(output_string, "Hello,%s!", name); // 输出到字符串,预期结果  Hello,Hello,John!printf("%s\n", output_string);return 0;
}

创建文件:
在这里插入图片描述
运行结果:

在这里插入图片描述


在上一篇博客【C语言】文件操作(一)中我们讲到标准流的时候,我们说:实际上 stdin stdout stderr 都是在C标准库中定义的全局变量,具有与 FILE* 类型相同的类型。这使得它们可以作为参数传递给标准库函数。

为了证明这一点,举例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>int main() {int num;// 从标准输入(键盘)读取数据printf("请输入一个整数:");fscanf(stdin,"%d", &num);// 将错误消息写入标准错误if (num < 0) {fprintf(stderr, "错误:输入的数字不能为负数\n");return 1;}// 输出结果到标准输出fprintf(stdout,"您输入的数字是:%d\n", num);return 0;
}

在这里插入图片描述

但在实际应用中我们并不需要这样做,因为程序在启动的时候,标准流是默认打开的,scanf 和 printf就可以满足我们在从键盘输⼊数据,向屏幕上输出数据。


在这里插入图片描述
如果你喜欢这篇文章,点赞👍+评论+关注⭐️哦!
欢迎大家提出疑问,以及不同的见解。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio升级Giraffe | 2022.3.1 Patch 1踩坑

这里写自定义目录标题 not "opens java.io" to unnamed module错误报错信息解决 superclass access check failed: class butterknife.compiler.ButterKnifeProcessor$RScanner报错报错信息解决 Android studio升级Giraffe | 2022.3.1 Patch 1后&#xff0c;出现项目…

web:[极客大挑战 2019]PHP

题目 点进页面显示如下 根据页面提示&#xff0c;这个网站有备份文件&#xff0c;备份文件一般是bak文件格式&#xff0c;用dirsearch扫描 访问之后下载了一个文件 里面都是一些代码 在index.php中发现了一个类的文件&#xff0c;一个get传参&#xff0c;然后将传进的值进行反序…

【数据结构】树的概念理解和性质推导(保姆级详解,小白必看系列)

目录 一、前言 &#x1f34e; 为什么要学习非线性结构 ---- 树&#xff08;Tree&#xff09; &#x1f4a6; 线性结构的优缺点 &#x1f4a6; 优化方案 ----- 树&#xff08;Tree&#xff09; &#x1f4a6; 树的讲解流程 二、树的概念及结构 &#x1f350; 树的概念 &…

QCefView 简介

什么是QCefView QCefView 是为 Qt 开发的一个封装集成了CEF(Chromium Embedded Framework)库的Wdiget UI组件。使用QCefView可以充分发挥CEF丰富强大的Web能力&#xff0c;快速开发混合架构的应用程序。它不需要开发者理解CEF的细节&#xff0c;能够在Qt中更容易的使用CEF&…

NLP 项目:维基百科文章爬虫和分类 - 语料库阅读器

塞巴斯蒂安 一、说明 自然语言处理是机器学习和人工智能的一个迷人领域。这篇博客文章启动了一个具体的 NLP 项目&#xff0c;涉及使用维基百科文章进行聚类、分类和知识提取。灵感和一般方法源自《Applied Text Analysis with Python》一书。 在接下来的文章中&#xff0c;我将…

Android 编译插桩操纵字节码

本文讲解如何编译插桩操纵字节码。 就使用 ASM 来实现简单的编译插桩效果&#xff0c;通过插桩实现在每一个 Activity 打开时输出相应的 log 日志。实现思路 过程主要包含两步&#xff1a; 1、遍历项目中所有的 .class 文件​ 如何找到项目中编译生成的所有 .class 文件&#…

初识多线程

一、多任务 现实中太多这样同时做多件事的例子了&#xff0c;例如一边吃饭一遍刷视频&#xff0c;看起来是多个任务都在做&#xff0c;其实本质上我们的大脑在同一时间依旧只做了一件事情。 二、普通方法调用和多线程 普通方法调用只有主线程一条执行路径 多线程多条执行路径…

xPortPendSVHandler任务切换流程

__asm void xPortPendSVHandler( void ) { extern uxCriticalNesting; extern pxCurrentTCB; extern vTaskSwitchContext; PRESERVE8 mrs r0, psp isb//指令同步命令&#xff0c; ldr r3, pxCurrentTCB /* Get the location of the current TCB. */ ldr r2, [r3]//r2保存…

【面试经典150 | 矩阵】螺旋矩阵

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;模拟方法二&#xff1a;按层模拟 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于…

flink选择slot

flink选择slot 在这个类里修改 package org.apache.flink.runtime.resourcemanager.slotmanager.SlotManagerImpl; findMatchingSlot(resourceProfile)&#xff1a;找到满足要求的slot&#xff08;负责从哪个taskmanager中获取slot&#xff09;对应上图第8&#xff0c;9&…

[vue-admin-template实战笔记]

1.克隆项目 git clone gitgitee.com:panjiachen/vue-admin-template.git 2.安装依赖 npm install 3.运行项目就会自动打开网页&#xff0c;并且热部署插件 npm run dev 4.查看代码 //将vue-admin-template拖入到idea中即可查看代码 1)并且发现&#xff0c;常用的东西已经集…

从零手搓一个【消息队列】创建核心类, 数据库设计与实现

文章目录 一、创建核心类1, 交换机2, 交换机类型3, 队列4, 绑定5, 交换机转发 & 绑定规则6, 消息7, 消息属性 二、数据库设计1, 使用 SQLite2, 使用 MyBatis2.1, 创建 Interface2.2, 创建 xml 文件 三、硬盘管理 -- 数据库1, 创建 DataBaseManager 类2, init() 初始化数据库…

什么是AI客流量算法?如何应用在实际场景中?

客流量分析算法简而言之就是一种利用数据分析和机器学习技术进行人流量统计、预测和分析的算法。它能够根据不同的数据来源&#xff0c;如摄像头、传感器等&#xff0c;对特定区域内的客流量进行实时监测和分析&#xff0c;并通过对历史数据的综合分析&#xff0c;提供客流趋势…

ARM-day2

1、1到100累加 .text .global _start_start:MOV r0, #1ADD r1,r0, #1fun:ADD r0,r0,r1ADD r1,r1, #1cmp r1, #0x65moveq PC,LRbl funstop:b stop.end2、思维导图

Java基础---第十篇

系列文章目录 文章目录 系列文章目录一、说说Java 中 IO 流二、 Java IO与 NIO的区别(补充)三、java反射的作用于原理一、说说Java 中 IO 流 Java 中 IO 流分为几种? 按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色…

java导出word(含图片、表格)

1.pom 引入 <!--word报告生成依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupI…

【单片机】12-串口通信和RS485

1.通信有关的常见概念 区分&#xff1a;串口&#xff0c;COM口&#xff0c;UART&#xff0c;USART_usart和串口区别-CSDN博客 串口、COM口、UART口, TTL、RS-232、RS-485区别详解-CSDN博客 1.什么是通信 &#xff08;1&#xff09;人和人之间的通信&#xff1a;说话&#xff…

腾讯云 Cloud Studio 实战训练营结营活动获奖公示

点击链接了解详情 “腾讯云 Cloud Studio 实战训练营” 是由腾讯云联合 CSDN 推出的系列开发者技术实践活动&#xff0c;通过技术分享直播、动手实验项目、优秀代码评选、有奖征文活动等&#xff0c;让广大开发者沉浸式体验腾讯云开发者工具 Cloud Studio 的同时&#xff0c;实…

《数据结构、算法与应用C++语言描述》-栈的应用-开关盒布线问题

开关盒布线问题 问题描述 在开关盒布线问题中&#xff0c;给定一个矩形布线区域&#xff0c;其外围有若干管脚。两个管脚之间通过布设一条金属线路来连接。这条金属线路称为电线&#xff0c;它被限制在矩形区域内。两条电线交叉会发生电流短路。因此&#xff0c;电线不许交叉…

Python异步框架大战:FastAPI、Sanic、Tornado VS Go 的 Gin

一、前言 异步编程在构建高性能 Web 应用中起着关键作用&#xff0c;而 FastAPI、Sanic、Tornado 都声称具有卓越的性能。本文将通过性能压测对这些框架与Go的Gin框架进行全面对比&#xff0c;揭示它们之间的差异。 原文&#xff1a;Python异步框架大战&#xff1a;FastAPI、Sa…