【嵌入式开发之标准I/O】流的刷新、定位以及格式化输出、输入

流的刷新

 int fflush(FILE *fp);
  • 成功时返回0;出错时返回EOF。

  • 将流缓冲区中的数据写入实际的文件。

  • Linux下只能刷新输出缓冲区,输入缓冲区丢弃。

  • 如果输出到屏幕使用fflush(stdout)。

流的定位

流的定位:ftell()函数 

long ftell(FILE *stream);

ftell() 函数的作用是获取文件的 当前指针位置 相对于 文件首地址 的 偏移字节数 ;

流的定位:fseek()函数 

long fseek(FILE *stream, long offset,  int whence);

描述及参数介绍

fseek()函数用来设置流 stream 的文件位置为给定的偏移 offset,参数 offset 意味着从给定的 whence 位置查找的字节数。 

  • fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END

  • SEEK_SET :从距文件开头 offset 位移量为新的读写位置

  • SEEK_CUR:以目前的读写位置往后增加 offset 个位移量

  • SEEK_END:将读写位置指向文件尾后再增加 offset 个位移量

  • offset参数:偏移量,可正可负

返回值

如果成功,则该函数返回零,否则返回非零值。

流的定位:rewind()函数

void rewind(FILE *stream);
主要功能

将文件内部的位置 指针重新指向一个流( 数据流/文件)的开头。 

返回值

该函数不返回任何值。

流的定位代码实例(ftell函数、fseek函数和rewind函数)

#include <stdio.h>
#include <stdlib.h>int main(int argc, const char *argv[])
{FILE *fp;char *buff;int ret;buff = (char *)malloc(20);if ((fp = fopen("ffseek.txt", "w+")) == NULL) {perror("fopen");return 0;}//向空文件些人字符,并输出文件指针fp的位置fwrite("abcdef", 6, 1, fp);printf("after fwrite fp = %d\n", (int)ftell(fp));//文件指针指向文件开头,并读取文件内容,再显示文件指针位置rewind(fp);printf("after rewind fp = %d\n", (int)ftell(fp));ret = fread(buff, 12, 1, fp);printf("fread: %s\n", buff);printf("after fread fp = %d\n\n", (int)ftell(fp));//利用SEEK_SET参数,设置偏移为3,显示文件指针位置fseek(fp, 3, SEEK_SET);printf("after SEEK_SET=3 fp = %d\n", (int)ftell(fp));//从指针新指向的位置开始替换字符,并显示替换后指针位置fwrite("aa", 2, 1, fp);printf("after fwrite 2 fp = %d\n", (int)ftell(fp));//文件指针指向文件开头,显示被替换后的内容rewind(fp);ret = fread(buff, 12, 1, fp);printf("after SEEK_SET=3 and instead \"aa\":%s\n", buff);printf("after SEEK_SET=3 fp = %d\n\n", (int)ftell(fp));//设置SEEK_CUR 3参数后,fp指针的位置fseek(fp, 3, SEEK_CUR);printf("after SEEK_CUR 3 fp = %d\n", (int)ftell(fp));//设置SEEK_END 2参数后,fp指针的位置fseek(fp, -2, SEEK_END);printf("after SEEK_END -2 fp = %d\n", (int)ftell(fp));return 0;
}

注意事项

  1. 文件的打开使用a模式 fseek无效

  2. rewind(fp) 相当于 fseek(fp,0,SEEK_SET);

  3. 这三个函数只适用2G以下的文件

格式化输入和输出

格式化输出

格式化输出:printf()函数

int printf(const char *format, ...);
printf("<格式化字符串>", <参量表>);
主要功能

发送格式化输出到标准输出 stdout。

返回值

如果成功,则返回写入的字符总数,否则返回一个负数。

格式化输出:fprintf()函数

int fprintf(FILE *stream, const char *fmt, …);
主要功能

这个函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件.

返回值

成功时返回输出的字符个数;出错时返回EOF。

代码实例
#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp;char buf[100] = {0};int year = 2021;int month = 10;int day = 1;if ((fp = fopen("fprintf.txt", "w")) == NULL) {perror("fopen");return 0;}fprintf(fp,"%d-%d-%d\n", year, month, day);fclose(fp);return 0;
}
运行结果及分析
2021-10-1

首先,通过fopen函数打开文件fprintf.txt,再将year,month,day三个变量的值读取到这个文件中,再通过cat命令显示文件中的内容。

格式化输出:sprintf()函数 

int sprintf( char *buffer, const char *format [, argument] … );
主要功能

主要功能是把格式化的数据写入某个字符串。

返回值

成功时返回输出的字符个数;出错时返回EOF。

代码实例
#include <stdio.h>int main(int argc, const char *argv[])
{char buf[100] = {0};int year = 2021;int month = 10;int day = 1;sprintf(buf,"%d-%d-%d", year, month, day);printf("%s\n", buf);return 0;
}
运行结果及分析
2021-10-1

将year,month,day三个变量值读取到字符串buf中,再通过printf输出。 

格式化输入 

格式化输入:scanf()函数

int scanf(const char * restrict format,...);
主要功能

按用户指定的格式从键盘上把数据输入到指定的变量之中

函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。

函数 scanf() 是从标准输入流stdin (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。

返回值

scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。

 格式化输入:fscanf()函数

int fscanf(FILE *stream, const char *format, ...);
主要功能

根据数据格式 const char * format , 从文件 FILE * stream 中 , 读取数据存储到 [argument...] 参数中 。 

返回值

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

代码实例
#include <stdio.h>int main(int argc, const char *argv[])
{FILE *fp;int year;int month;int day;if ((fp = fopen("fprintf.txt", "r")) == NULL) {perror("fopen");return 0;}fscanf(fp,"%d-%d-%d", &year, &month, &day);printf("%d-%d-%d\n", year, month, day);fclose(fp);return 0;
}
运行结果及分析
2021-10-1

将fprintf.txt文件中的数据,通过fscanf读取到year,month,和day三个中,然后通过printf函数输出。

格式化输入:sscanf()函数

int sscanf(const char *str, const char *format, ...);
主要功能

sscanf函数的主要功能是从字符串读取格式化输入。

返回值 

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

代码实例
#include <stdio.h>int main(int argc, const char *argv[])
{char buf[100] = {0};int year = 2021;int month = 10;int day = 1;int syear;int smonth;int sday;sprintf(buf,"%d-%d-%d", year, month, day);printf("%s\n", buf);sscanf(buf,"%d-%d-%d", &syear, &smonth, &sday);printf("%d, %d, %d\n", syear, smonth, sday);return 0;
}
 运行结果及分析
2021-10-1
2021, 10, 1

先通过sprintf将年月日按一定格式输出到buf字符串中,在通过sscanf函数将buf字符串中的字符分别输入到syear,smonth和sday三个变量中,最后通过printf函数输出。

实例分析

实例要求

每隔1秒向文件test.txt中写入当前系统时间,格式如下:

1,  2014-10-15 15:16:42

2,  2014-10-15 15:16:43

该程序无限循环,直到按Ctrl-C中断程序,每次执行程序时,系统时间追加到文件末尾,序号递增。

相关提示

time()用来获取系统时间(秒数)
time_t time(time_t *seconds) 1970.1.1 0:0:0
localtime()将系统时间转换成本地时间
struct tm *localtime(const time_t *timer)
struct tm {int tm_sec;         /* 秒,范围从 0 到 59                */int tm_min;         /* 分,范围从 0 到 59                */int tm_hour;        /* 小时,范围从 0 到 23                */int tm_mday;        /* 一月中的第几天,范围从 1 到 31                    */int tm_mon;         /* 月份,范围从 0 到 11                */int tm_year;        /* 自 1900 起的年数                */int tm_wday;        /* 一周中的第几天,范围从 0 到 6                */int tm_yday;        /* 一年中的第几天,范围从 0 到 365                    */int tm_isdst;       /* 夏令时                        */    
};

实例代码

#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <string.h>#define FNAME "1.txt"
#define MODE "a+"int main(int argc, const char *argv[])
{FILE *fp;time_t ctime;struct tm *ctimestr;int linecount = 0;char ch;//打开文件,打开失败直接返回if ((fp = fopen(FNAME, MODE)) == NULL) {perror("fopen");return -1;}//计算1.txt存储数据的行数,实现每次重新运行序号都是累增while ((ch = fgetc(fp)) != -1) {if (ch == '\n') {linecount++;}}//获取系统时间,转换为当地时间,并写入到文件while (1) {ctime = time(NULL);//获取系统时间ctimestr = localtime(&ctime);//将系统时间转换为当地时间//在屏幕上输出时间printf("%d, %04d-%02d-%02d %02d:%02d:%02d\n", linecount, ctimestr->tm_year+1900, ctimestr->tm_mon+1, ctimestr->tm_mday, ctimestr->tm_hour,ctimestr->tm_min, ctimestr->tm_sec);//把时间输出到文件fprintf(fp,"%d, %04d-%02d-%02d %02d:%02d:%02d\n", linecount, ctimestr->tm_year+1900, ctimestr->tm_mon+1, ctimestr->tm_mday, ctimestr->tm_hour,ctimestr->tm_min, ctimestr->tm_sec);fflush(fp);//写完文件记得刷新,写进磁盘sleep(1);linecount++;}fclose(fp);//关闭文件return 0;
}

运行结果及分析

0, 2024-07-21 00:42:45
1, 2024-07-21 00:42:46
2, 2024-07-21 00:42:47
3, 2024-07-21 00:42:48
4, 2024-07-21 00:42:49
5, 2024-07-21 00:42:50
6, 2024-07-21 00:42:51
7, 2024-07-21 00:42:52
8, 2024-07-21 00:42:53
9, 2024-07-21 00:43:17
10, 2024-07-21 00:43:18
11, 2024-07-21 00:43:19
12, 2024-07-21 00:43:20
13, 2024-07-21 00:43:21
14, 2024-07-21 00:43:22
15, 2024-07-21 00:43:23
16, 2024-07-21 00:43:24
17, 2024-07-21 00:43:25
18, 2024-07-21 00:43:26
19, 2024-07-21 00:43:27

注意事项

  • 写完文件记得fflush ,写到磁盘里面去。

  • int tm_mon;获取的值要加1是正确的月份

  • int tm_year;获取的值加1900是正确的年份

  • 每次运行都要在原来的基础上累计行号,可以用fgetc函数逐一读取文件中的字符,看能读取到多少个‘\n’则是多少行。

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

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

相关文章

JavaScript:节流与防抖

目录 一、前言 二、节流&#xff08;Throttle&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装节流函数 三、防抖&#xff08;Debounce&#xff09; 1、定义 2、使用场景 3、实现原理 4、代码示例 5、封装防抖函数 四、异同点总结 一、前言 …

信息检索(39):Condenser: a Pre-training Architecture for Dense Retrieval

Condenser: a Pre-training Architecture for Dense Retrieval 摘要1 引言2 相关工作3 方法3.1 前提3.2 Transformer 编码器的问题3.3 Condenser3.4 Transformer 编码器的 Condenser 4 实验4.1 预训练4.2 句子相似度4.3 开放域问答检索4.4 Web search 检索 5 注意力分析6 结论 …

Adobe Premiere Pro(Pr)安装包软件下载

一、简介 Adobe Premiere Pro&#xff08;简称Pr&#xff09;是由Adobe公司开发的一款功能强大的视频编辑软件。它支持多平台使用&#xff0c;包括Windows和Mac系统&#xff0c;并且拥有良好的兼容性和高效的性能。Premiere Pro不仅提供了视频剪辑、特效添加、音频处理等基本功…

《从C/C++到Java入门指南》- 9.字符和字符串

字符和字符串 字符类型 Java 中一个字符保存一个Unicode字符&#xff0c;所以一个中文和一个英文字母都占用两个字节。 // 计算1 .. 100 public class Hello {public static void main(String[] args) {char a A;char b 中;System.out.println(a);System.out.println(b)…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 二进制游戏(200分)- 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

npm install时报错 reason: connect ETIMEDOUT

在VS code中导入新项目&#xff0c;执行npm install时报错&#xff1a; npm warn old lockfile Could not fetch metadata for antv/coord0.1.0 FetchError: request to https://registry.npmjs.org/antv%2fcoord failed, reason: connect ETIMEDOUT 150.242.56.251:443 npm w…

大数据之路 读书笔记 Day8 数据存储

回顾&#xff1a; 大数据之路 读书笔记 Day7 实时技术 简介及流式技术架构 大数据之路 读书笔记 Day6 离线数据开发之数据开发平台 数据存储 1 数据类型 实时任务在运行过程中&#xff0c;会计算很多维度和指标&#xff0c;这些数据需要放在一个存储系统中作为恢复或者关联使…

微信小程序开发:DOM 相关 API 使用详解

在微信小程序开发中&#xff0c;与传统的网页开发相比&#xff0c;由于安全性和性能考虑&#xff0c;访问 DOM&#xff08;文档对象模型&#xff09;是受限的。然而&#xff0c;微信小程序提供了一些特定的 API&#xff0c;使开发者能够处理和操作视图层&#xff0c;实现丰富的…

Transformer之Vision Transformer结构解读

论文地址 代码地址 写在前面 什么是Transformer呢&#xff1f;就是把符号向量化为Token&#xff0c; 再和位置编码求和或者做阿达玛积&#xff0c;最后送入一定层数的Attention Block构成的Encoder和Decoder&#xff0c;就完成了Transformer的基础功能。 那么&#xff0c;把上…

C基础函数——内存分配(未完)

在C语言中&#xff0c;内存管理是非常重要的一部分。C语言提供了几种不同的函数用于动态内存分配和释放&#xff0c;这些函数允许程序在运行时根据需要分配和回收内存。以下是C语言中常用的几个内存管理函数&#xff1a; malloc() void malloc(size_t size); 这个函数用于请求…

C++中枚举(enum)的用法和限制

在C中&#xff0c;枚举&#xff08;enum&#xff09;是一种用户定义的类型&#xff0c;它允许程序员为整数常量指定易于阅读的名字。枚举类型是由一组命名的整型常量组成的类型&#xff0c;每个常量都表示该类型的一个有效值。枚举在编程中常用于表示一组固定的值&#xff0c;如…

MySQL:mysql的数据类型

MySQL 作为一个流行的关系型数据库管理系统&#xff0c;支持多种数据类型以满足不同的数据处理和存储需求。正确理解和使用这些数据类型对于提高数据库性能、确保数据完整性和准确性至关重要。 MySQL 数据类型 数据类型定义了列中可以存储什么数据以及该数据怎样存储的规则。…

idea2019版本创建JavaWeb项目并配置Tomcat步骤

一、创建JavaWeb项目 1.新建项目File->New->Project 2. 选择JavaWeb应用在New Project窗口中选择Java后勾选Java EE中的Web Application后点击next即可 3.设置项目名称后点击finish即可 4.至此项目创建完成&#xff0c;检查文件是否齐全&#xff0c;开始配置Tomcat 二、…

IDEA工具中Java语言写小工具遇到的问题

一&#xff1a;读取excel时遇到 org/apache/poi/ss/usermodel/WorkbookProvider 解决办法&#xff1a; 在pom.xml中把poi的引文包放在最前面即可&#xff08;目前就算放在最后面也不报错了&#xff0c;不知道为啥&#xff09; 二&#xff1a;本地maven打包时&#xff0c;没有…

base SAS programing学习笔记(read raw files2)

使用COLUMN input和FORMATTED input读入固定位置的外部文件&#xff1b;如下图所示&#xff0c; 1.COLUMN input &#xff08;按列数读入外部文件数据&#xff09; 使用column input 不需要按从左到右的顺序读取外部文件的数值&#xff0c;可以是任意读取&#xff0c;也可以重…

LeeCode Practice Journal | Day18_Binary Tree06

530.二叉搜索树的最小绝对差 题目&#xff1a;530. 二叉搜索树的最小绝对差 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;代码随想录 (programmercarl.com) 验证搜索树的进阶&#xff0c;二叉树中的双指针&#xff0c;思考过程中发现容易弄混递归向下传播和向上回…

STM32F103定时器中断详解

目录 目录 目录 前言 一.什么是定时器 1.1 STM32F103定时器概述 1.2基本定时器 1.2通用定时器 1.3高级定时器 1.4 三种定时器区别 基本定时器&#xff08;Basic Timer&#xff09; 通用定时器&#xff08;General-Purpose Timer&#xff09; 高级定时器&#xff08;Advanced Ti…

ubuntu2204配置anacondacuda4090nvidia驱动

背景 某个机房的几台机器前段时间通过dnat暴露至公网后被入侵挖矿&#xff0c;为避免一些安全隐患将这几台机器执行重装系统操作&#xff1b; 这里主要记录配置nvidia驱动及cuda&anaconda。 步骤 大概分为几个步骤 禁用nouveau配置grub显示菜单install nvidia-driveri…

基于Python+Django,开发的一个在线教育系统

一、项目简介 使用Python的web框架Django进行开发的一个在线教育系统&#xff01; 二、所需要的环境与组件 Python3.6 Django1.11.7 Pymysql Mysql pure_pagination DjangoUeditor captcha xadmin crispy_forms 三、安装 1. 下载项目后进入项目目录cd Online-educ…

【Rust光年纪】解锁Rust语言核心库奥秘:加密、数字签名和数据库操作全面解析

从加密到数据库&#xff1a;探索Rust语言丰富的工具库生态系统 前言 在Rust语言开发中&#xff0c;使用合适的库可以极大地提高代码的安全性和效率。本文将介绍一些用于加密、数字签名、数据库连接等功能的Rust语言库&#xff0c;帮助读者快速了解其核心功能、使用场景以及安…