Chapter5-标准I/O库(补充)-「APUE读书笔记」

Redis-3.0.7_ubuntu下编译 liblua.a(loslib.o): In function `os_tmpname': loslib.c:(.text+0x28b): warning: the use of `tmpnam' is dangerous, better use `mkstemp' cc -O2 -Wall -DLUA_ANSI -DENABLE_CJSON_GLOBAL -c -o luac.o luac 阅读详情
  • 实现

每个标准I/O流都有一个相关联的文件描述符,可以用fileno函数来获取。

#include<stdio.h>

int    fileno(FILE*  fp);           //POSIX支持的扩展,函数dup和fcntl需要此函数

one line to standard error
stream = stdin, line buffered, buffer size = 1024
stream = stdout, line buffered, buffer size = 1024
stream = stderr, unbuffered, buffer size = 1
stream = /etc/passwd, fully buffered, buffer size = 4096
由范例可看出流连接到终端时是行缓冲

而当流定向到文件时

stream = stdin, fully buffered, buffer size = 4096
stream = stdout, fully buffered, buffer size = 4096
stream = stderr, unbuffered, buffer size = 1
stream = /etc/passwd, fully buffered, buffer size = 4096
流变为了全缓冲,标准错误仍然不带缓冲

  • 临时文件

#include<stdio.h>

char*    tmpnam(char*  ptr);          //返回路径

FILE*    tmpfile();                           //返回文件指针,错误返回NULL

tmpnam产生的路径放在静态区,若需多次使用该路径应该保存路径副本,重复调用tmpnam会覆盖静态区。

tmp创建临时二进制文件(wb+),在关闭文件或程序终止时自动删除。

char name[L_tmpnam], line[MAXLINE];
FILE* fp;
 
printf("%s\n", tmpnam(NULL));
tmpnam(name);
printf("%s\n", name);
FILE* fp2;
if((fp2 = fopen(name, "r+")) == NULL)
  err_sys("fopen error");
if((fp = tmpfile()) == NULL)
  err_sys("tmpfile error");
fputs("one line of output\n", fp);
rewind(fp);
if(fgets(line, sizeof(line), fp) == NULL)
  err_sys("fgets error");
fputs(line, stdout);  
输出
/tmp/fileC9o7x4
/tmp/fileojVsqW
fopen error: No such file or directory

可以看到tmpnam产生的路径名已经不能再打开,因为使用tmpnam后会立即unlink它(解除链接而不删除内容)。

同时在编译时有如下提示

/tmp/cc57tA4p.o:在函数‘main’中:
5.13.cpp:(.text+0x21): 警告: the use of `tmpnam' is dangerous, better use `mkstemp'
事实上XSI扩展部分定义了另外两个函数mkdtemp和mkstemp

char*    mkdtemp(char*  template);       //成功返回目录路径,出错返回NULL

int    mkstemp(char*  template);            //成功返回文件描述符,出错返回-1

template是后6位设置为XXXXXX的路径名,函数将占位符替换成随机字符来构建文件名或目录名。

mkstemp返回文件描述符并以读写方式打开,而且不同于tempfile,此临时文件并不会自动删除。

tmpnam和tempnam在返回路径名和创建文件间有时间差,在这之间该路径名可能被占用,所以推荐使用tmpfile和mkstemp。

  • 内存流

创建内存流的函数

#include<stdio.h>

FILE*    fmemopen(void*  restrict  buf,  size_t  size,  const  char*  restrict  type);

成功返回流指针,错误返回NULL。buf为空时,分配size字节的缓冲,这样在关闭流时缓冲区被释放。

以追加方式打开内存流时,当前文件位置设为缓冲区的第一个null字节,若没有则设为缓冲区结尾的后一个字节。如果不是以追加方式打开时,当前位置设为缓冲区开始位置。

增加流缓冲区中数据量以及调用fclose,fflush,fseek,fseeko,fsetpos都会在当前位置写入一个null字节。

还有两个函数是

#include<stdio.h>

FILE*  open_memstream(char**  bufp,  size_t*  sizep);                     //面向字节

#include<wchar.h>

FILE*  open_wmemstream(wchar_t**  bufp,  size_t*  sizep);            //面向宽字节

不同于fmemopen,

  • 这两个只能以写打开
  • 不能指定自己的缓冲区,但可以通过bufp和sizep来访问缓冲区的地址和大小
  • 关闭流后需手动释放缓冲区
  • 对流添加字节会增加缓冲区大小

缓冲区调整后需调用fclose或fflush才能生效,并且只在下次写入或fclose前才有效,因为缓冲区的增长可能重新分配内存。内存流适合创建字符串,把流作为参数用于临时文件的函数,可以大大提高性能。


多维聚合数据操作:维度对齐、空值注入与粒度桥接实战 多维聚合是OLAP分析与BI报表的核心能力,其本质是将明细数据压缩为多坐标轴构成的‘数据立方体’。但真实数据存在维度歧义、空值语义模糊、时间粒度错配等结构性问题,导致简单GROUP BY结果失真。本文聚焦多维聚合前的关键数据操作——维度对齐解决同义异形与同形异义,空值策略实现上下文感知注入,粒度桥接保障跨周期指标可追溯。这些操作并非ETL流水线,而是决定立方体几何完整性的精密步骤。适用于构建可信OLAP平台、提升Tableau/Power BI分析鲁棒性,以及治理‘同一指标多处不一致’等典型数据信任问题。 阅读详情

相关推荐

在win10系统上安装opnet14.5注意事项和步聚

opnet 14.5安装避坑!

miracle_eicont的专栏 1037

redis在Linux安装报错

redis在CentOS7上安装及配置开机启动服务

宝哥77的博客 1万+

云架构师进阶【SAP迁移方案设计】手把手教您玩转SAP上云

一,项目背景介绍 今天又接到了北京某制造企业SAP迁移的场景,先简单说明一下,好好的SAP在运行着为什么要做迁移这类大动作呢?众所周知SAP的ERP是企业的绝对核心系统,尤其对于制造业更是核心的系统,这样一套核心系统还是生产环境在迁移的过程中必然要面临比较大的挑战,如果有任何问题的话,都会对企业的绩效产生很大的影响。 经过跟客户沟通才得知,客户的SAP原来的系统是托管在运营商机房里,近期感染了勒索病毒,导致业务宕机,SAP应用服务器无法启动,仅有的数据库服务器可以运行。基于上述情况公司领导当机立断决定迅

bdsh818的博客 4220

RHEL5 编译OPENCV2.1出现如下错误

CMakeFiles/mltest.dir/src/slmltests.o(.text._ZN11CV_SLMLTest13run_test_caseEi+0x8f): In function `CV_SLMLTest::run_test_case(int)': : warning: the use of `tmpnam' is dangerous, better use `mkstemp'

sxjk1987的专栏 1392

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤

不同IP网段的PLC进行S7通信(PUT_GET)的具体步骤 一般情况下,我们使用西门子的S7通信时都是将网络中的PLC的IP设置在同一网段,那么如果涉及到旧项目改造时,不方便修改IP地址,只能进行2个网段通信时,可以参考以下步骤: 准备条件: 2个路由器 CPU 1212C 主动连接 CPU 314C-2PN/DP 被动连接 网络搭建如下图所示: S7-1212C一侧 建立S7主动连接 ,IP地址:192.168.5.40,编写get/put 通信程序 S7-300 IP地址:192.168.0

Robot_PLC_HMI_Automation 2万+

第四天 Labview交互也很轻松(4.1 DAQ数据采集)

LabVIEW DAQ数据采集有很大的优势,NI提供了超过5千万条I/O通道,支持多种主流总线(如USB、PCI、PCIe、PXI等),并为所有这些设备提供统一的编程接口,实现软硬件的无缝集成。LabVIEW包含全套范例,覆盖各类应用,用户无需从头创建整个数据采集系统,可以快速启动并执行这些范例程序。所有NI DAQ硬件都采用NI-DAQmx驱动程序,支持多种编程语言,并包含了这些编程语言的示例代码,使得与NI硬件的通信变得更加便捷。

weixin_38637405的博客 2617

第五章 标准I/O库

函数    fwide用于设置流的定向     fwide(FILE *fp,int mode);         若 mode 为负,fwide 将试图使指定的流的字节定向的         若    为正,            宽定向的         若    为0,将不试图设置流的定向。     对于这个函数,书上没有过多介绍,我也没用过,暂且放在这里吧 文件描述符对

博客 843

ISO13849功能安全从入门到精通(3):安全功能及其对降低风险的贡献4

例如,如果机器必须在有限速度下运行时进行设置,那么在低加速度值下进行设置时,参数P1将是正确的选择:随着危险缓慢出现并给予足够的运动自由,操作员将能够移出危险区域。例如,在无故障的条件下,在操作者的手的方向移动的滚子不能陷住它。在所有其他情况下,F1是正确的选择,前提是危险暴露的持续时间不超过机器总操作时间的1/20。需求来源于必要的风险降低。由于这些考虑而降低的PLr在任何情况下都不得低于通过比较方式考虑的机器的PLr,因为并不能从事故发生率低和严重程度低得出实施的安全功能提供的安全水平高于要求。

wdconan001的博客 834

Chapter5-标准I/O库(中)-「APUE读书笔记」

读和写流 当流打开后,有3种非格式化I/O可对其进行读写操作:(1)每次一个字符,(2)每次一行的I/O,(3)直接I/O。 1、输入函数 #include //三个函数返回取到的字符,出错或到达文件尾返回EOF int    getc(FILE*  fp);     //可被实现为宏。 int    fgetc(FILE*  fp); int    getchar(void

Hering_Linux的专栏 780

详解大模型微调数据集构建方法(持续更新)

本文详细介绍了大模型微调数据集构建方法,希望能对学习大模型的同学们有所帮助。 文章目录 1. 前言 2. 微调数据集构建方法 2.1 方法一 2.2 方法二 2.3 方法三 2.4 方法四 2.5 方法五

herosunly的博客 28万+

python基础之语言发展历史

博主简介:原互联网大厂tencent员工,网安巨头Venustech员工,阿里云开发社区专家博主,微信公众号java基础笔记优质创作者,csdn优质创作博主,创业者,知识共享者,欢迎关注,点赞,收藏。 目录一、前言二、发展历史1、Python是一种面向对象的解释型编程语言2、Python常被称为胶水语言3、Python由Guido开发4、Python连续多年入选编程语言TOP105、Python的发展历史三、总结 一、前言   由于Python语言的简洁性、易读性以及可扩展性,它在网络爬虫、数据分析、.

jiankang66的博客 3348

Chapter5-标准I/O库(上)-「APUE读书笔记」

流和FILE对象 1、标准I/O库不同于一般的I/O函数,它们的操作是围绕流而不是文件描述符。当用标准I/O库打开或创建一个文件时,也就是让一个流与一个文件相关联。 2、标准I/O流可用于单字节或多字节字符集,这由流的定向来决定。 3、在未定向的流上使用多字节I/O函数就将流设置为宽定向,使用单字节就将流设置为字节定向。 4、只有函数freopen(清除流定向)和fwide(设置流定向

Hering_Linux的专栏 594

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Chapter5-标准I/O库(下)-「APUE读书笔记」

定位流 1、ftell和fseek #include long    ftell(FILE*  fp);                                                     //成功返回当前位置,出错返回-1 int    fseek(FILE*  fp,  long  offset,  int  whence);        //成功返回0,

Hering_Linux的专栏 523

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UNIX高级环境编程读书笔记(chapter14)

第十四章  高级IO 一、引言        本章内容包括非阻塞IO、记录锁、系统V流机制、I/O多路转接(select 和 poll函数)、readv和writev函数以及存储映射I\O,这些都称为高级I/O。 二、非阻塞I/O        非阻塞I/O使我们可以调用open、read和write这样的I/O操作,并使这些操作不会永远阻塞。如果这种操作不能完成,则调用立即出错返回,表示

fly_lhw的专栏 778

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

UNIX高级环境编程读书笔记(chapter5)

5.9 二进制IO 下列两个函数执行二进制IO操作:fread(),fwrite(). (1)读或写一个二进制数组; (2)读或写一个结构; 返回:读或写的对象数 5.10 定位流 有三种方法定位标准IO流 (1)ftell和fseek函数 (2)ftello和fseeko函数 (3)fgetpos和fsetpos函数 5.11 格式化IO 5.11.1  格

fly_lhw的专栏 511

APUE 读书笔记 - Chapter 15 Interprocess Communication

Pipe: 历史原因,造成管道是半双工的,有一些系统的管道已经实现全双工了。管道可以在拥有同一个祖先进程的进程之间进行通信,较常用于父进程与子进程之间的通信。 pipe(3)会返回两个文件描述符,其中,fd[0]表示读接口,fd[1]表示写接口,通常每个进程会根据自己的地位与需要,关闭相应的描述符,以达到管道的功能与目的。 popen可以产生一个管道,并且fork一个子进程...

weixin_30412167的博客 122

《C++ primer》(第5版) chapter10 读书笔记

文章目录10.1 概述10.2 初识泛型算法10.3 定制操作10.4 再探迭代器10.5 泛型算法结构10.6 特定容器算法 10.1 概述 大多数算法都定义在头文件algorithm中,标准库还在头文件numeric中定义了一组数值泛型算法 泛型算法的一个重要编程假定:算法永远不会改变底层容器的大小。算法可能改变那容器中保存的元素的值,也可能在容器内移动元素,但永远不会直接添加或删除元素 10.2 初识泛型算法 理解算法的最基本的方法就是了解它们是否读取元素、改变元素或是重排元素顺序(见例子一).

qq_39621037的博客 166

读书笔记:C++ primer 5th edition--chapter10.泛型算法

part1.概述 1.泛型算法不直接操作容器,而是遍历两个迭代器制定的一个元素范围。 2.迭代器令算法不依赖与容器,但是算法依赖于元素类型的操作。 3.算法不会改变底层容器的大小 part2.初识 1.只读算法。 int sum = accumulate(vec.cbegin(), vec.cend(), 0 ); string sum = accumulate(vec.cb

Joker's Time 424

UNIX高级环境编程读书笔记(chapter1-3)

UNIX: 程序的执行实例被称为进程; UNIX 环境高级编程: 1.调用open函数可以打开或创建一个文件. 2.可以调用creat函数创建一个新文件. 3.close函数关闭一个打开的文件. 4.lseek函数:每个打开的文件都有一个与其相关联的"当前文件偏移量".他通常是一个非负整数          Ex1:测试能否对标准输入设置偏移量: #include "ap

fly_lhw的专栏 588

UNIX高级环境编程读书笔记(chapter7)

7.1 main函数 C程序总是从main函数开始执行。 7.2 进程终止 有8种方式是进程终止 (1)从main返回 (2)调用exit() (3)调用_exit或_Exit (4)最后一个线程从启动例程返回 (5)最后一个线程调用pthread_exit 异常终止有三种方式: (6)调用abort (7)接到一个信号并终止 (8)最后一个线程对取消请求做

fly_lhw的专栏 609

UNIX高级环境编程读书笔记(chapter12)

第十二章  线程控制 一、线程限制         与其它的系统限制一样,这些线程也可以通过sysconf函数进行查询。         与sysconf报告的其它限制一样,这些限制的使用是为了增强应用程序在不同的操作系统实现之间的可移植性。 二、线程属性 实例:以分离状态创建的线程 #include "apue.h" #include int makethre

fly_lhw的专栏 517

读书笔记(一)——Element of Financial Risk Management

第一章:Risk Management and Financial Returns(风险控制和金融收益) Why Should Firms Manage Risk? a brief taxonomy of risks:Market Risk,Liquidity Risk,Operational Risk,Credit Risk,Business Risk asset returns:l...

weixin_30343157的博客 300

临时文件

ISO C标准I/O提供了两个函数以帮助创建临时文件。 #include char*tmpnam(char*ptr);//返回指向唯一路径名的指针; FILE*tmpfile(void);//成功则返回文件指针;失败返回NULL; tmpnam产生一个与现在文件名不同的一个有效路径名字符串。每次调用它时,它都产生一个不同的路径名,最多调用次数是TMP_MAX(23832

yehenhei的专栏 1111

AUPE学习第五章------标准I/O库

基本上所有的操作系统都实现了标准I/O库。 5.2流和FILE对象 所有的I/O函数都是针对文件描述符的。当文件打开时,就返回一个文件描述符,然后用这个文件描述符做后续的I/O操作。 标准I/O库的操作是围绕流来进行的,当标准I/O库打开一个文件的时候,一个文件已经与一个流关联了。 我们可以用freopen函数来清除一个流定向,然后用fwide函数来设置一个流定向。 int   fwid

西北风的专栏 1771
上一篇: Chapter5-标准I/O库(下)-「APUE读书笔记」
下一篇: 一键开启Linux的键盘背景灯
Hering_Linux
博客等级 码龄12年 0粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值