10-12Linux流编程的一些知识点
第五章 Linux 的流编程
Linux流操作基础
流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度。
流的结构和操作流程:流操作函数的操作对象不是一个文件描述符,而是一个缓冲区,这个缓冲区带有打开文件的所有信息,以及缓冲区的有关信息。
标准流:#define STDIN_FILENO 0 //标准输入,一般是键盘
#define STDOUT_FILENO 1 //标准输出,一般是显示器
#define STDERR_FILENO 2 //标准错误输出,一般是显示器
流的打开和关闭函数:
#include <stdio.h>
FILE *fopen(const char *path, const char *mode);
FILE *fdopen(int fd, const char *mode);
FILE *freopen(const char *path, const char *mode, FILE *stream);
int fclose(FILE *fp);
mode: r或rb:只读,文件必须存在
w或rw:只写,如果文件存在,则重写,如果不存在,则建立。
a或ab:添加打开,如果文件存在,则紧接着文件末尾输入;否则,建立新文件。
r+,rb+,r+b:读写打开。文件必须存在,打开后,文件内容不变,文件指针指向文件头。
w+,wb+,w+b:更新打开。若文件存在,则长度截为0,否则,创建新文件。
a+,ab+, a+b:更新打开。若文件存在,其内容不变,若不存在,建立新文件。如果是读,则从文件开头读,如果写,则追加到文件末尾。
流的缓冲方式和缓冲区设置:
#include <stdio.h>
int fileno(FILE *fp);
流的缓冲区设置方式:
#include <stdio.h>
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
void setbuffer(FILE *stream, char *buf, size_t size);
void setlinebuf(FILE *stream);
流的读写:
字符读写:
#include <stdio.h>
int fgetc(FILE *stream);//不能被实现为宏
int getc(FILE *stream);//可被实现为宏
int getchar(void);
int fputc(int c, FILE *stream);//不能实现为宏
int putc(int c, FILE *stream);//可被实现为宏
int putchar(int c);//相当于int putc(int c, FILE stdout);
行读写:
#include <stdio.h>
char *fgets(char *s, int size, FILE *stream);//设置的缓冲区大小为size,总是以NULL结尾
char *gets(char *s);//从标准缓冲区读,不支持使用,因为没有设置缓冲区大小,容易导致缓冲区溢出
int *fputs(const char *s, FILE *stream);//将一个以NULL结尾的字符串去掉NULL以后写入stream中,并不要求每次写一行,因为它并不要求NULL之前必须是换行符
int *puts(const char *s);//将NULL去掉,并加上一个换行符输出到标准输出,所以应该尽量避免使用,以免导致错误
二进制读写(块/结构):
size_t fread(void *buf, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *buf, size_t size, size_t nmemb, FILE *stream);
注意:块读写只能在同一系统下使用,否则可能会因为系统对结构体数据存储方式不同,以及结构体偏移量不同而产生错误。
流的出错处理:
#include <stdio.h>
int feof(FILE *stream);//检查是否到达文件尾
int ferror(FILE *stream);//检查时候出现错误
void clearerr(FILE *stream);//清除流的错误
流的冲洗:
#include <stdio.h>
int fflush(FILE *stream);
#include <stdio.h>
#include <stdio_ext.h>
int _fpurge(FILE *stream);
注意:fflush函数会在调用fclose()函数关闭流或者在一个进程被关闭之后自动调用,不需要手动去调用。
流的定位:
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);//指定偏移量
long ftell(FILE *stream);//返回当前偏移量
void rewind(FILE *stream);//定位到文件头
int fseeko(FILE *stream, off_t offset, int whence);//文本文件定位偏移量
off_t ftello(FILE *stream);//返回当前偏移量
fgetpos和fsetpos函数:
#include <stdio.h>
int fgetpos(FILE *stream, fpos_t *pos);
int fsetpos(FILE *stream, fpos_t *pos);//这两个函数和fseek,ftell的主要区别是偏移量使用了抽象的pos_t结构体来存放了,这样的好处是在不同的系统上方便了一些。
流的格式化输入和输出:
格式化输出:
#include <stdio.h>
int printf(const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
#include <stdarg.h>
#include <stdio.h>
//以下几个和上面的4个的区别是后面的参数列表是一个指向一系列参数的指针
int vprintf(char *format, va_list arg_ptr);
int vfprintf(FILE *stream, const char *format, va_list arg_ptr);
int vsprintf(char *str, const char *format, va_list arg_ptr);
int vsnprintf(char *str, size_t size, const char *format, va_list arg_ptr);
//返回值要么是输出的字符数,要么是一个负值
格式化输入:
#include <stdio.h>
int scanf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int sscanf(const char *str, const char *format, ...);
#include <stdarg.h>
int vscanf(const char *format, va_list arg_ptr);
int vfscanf(FILE *stream, const char *format, va_list arg_ptr);
int vsscanf(const char *str, const char *format, va_list arg_ptr);
格式化参数:
注意:区分:“空白符”, “空格符”, “空字符”。空白符包括空格符,制表符,水平制表符, 换行符, 走纸符,即isspace()函数返回值为真的字符;空格符是一个“ ”, 空字符是NULL,即'\0'。
10-12Linux流编程的一些知识点的更多相关文章
- 10款无需编程的App DIY开发工具
10款无需编程的App DIY开发工具 你有一个很棒的创意但不会编程怎么办?外包.合伙开发还是从零学编程?这里提供另外一种方式--使用无需编程的App DIY开发工具.DIY开发工具不仅节省了开发时 ...
- Spark结构式流编程指南
Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...
- 五分钟学习Java8的流编程
1.概述 Java8中在Collection中增加了一个stream()方法,该方法返回一个Stream类型.我们就是用该Stream来进行流编程的: 流与集合不同,流是只有在按需计算的,而集合是已经 ...
- 10条PHP编程习惯助你找工作
过去的几周对我来说是一段相当复杂的经历.我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐 趣.我从来没有被开除过,所以很难不去想得太多.我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人, ...
- 10条PHP编程习惯
过去的几周对我来说是一段相当复杂的经历.我们公司进行了大裁员,我是其中之一,但却体验到了其中的乐 趣.我从来没有被开除过,所以很难不去想得太多.我开始浏览招聘板块,一个全职PHP程序员的职位很吸引人, ...
- 记录这段时间java编程的小知识点
记录这段时间java编程的小知识点 eclipse项目导入中文乱码 eclipse左侧目录结构变动 eclipse代码段左右移动 按tal键,是整体右移. 按shift table 同时按,是整体左 ...
- 偏执却管用的10条Java编程技巧
本文由 ImportNew - LynnShaw 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 经过一段时间的编码(咦,我已经经历了将近20年的编程生涯,快乐的日子总是过得 ...
- Java中10个流对象重点掌握
目前为止,10个流对象重点掌握: 字符流: FileReader FileWriter BufferedReader BufferedWriter 字节流: FileInputStream FileO ...
- 第10章 Shell编程(2)_字符截取命令
2. 字符截取命令 2.1 cut字段提取命令(grep提取行,cut提取列) (1)cut命令:#cut [选项] 文件名 选项: -f 列号:提取第几列: -d 分隔符:按照指定分隔符分割列,默认 ...
随机推荐
- sql 如何更改表的字段属性
alter table tablename alter column colname newDataType 比如:ALTER TABLE mytable ALTER COLUMN myco ...
- c#中变量的作用域
C#中的作用域和javascript中的作用域还是有区别的.呵呵 class Person { /* *确定C#变量作用域的2个规则. 1.类的字段所处的作用域等同于该字段所属类所在的作用域; * 2 ...
- ubuntu16.04初始化配置
允许root登录 sudo passwd root 启动网卡DHCP并配置DNS vi /etc/network/interfaces auto ens3 #auto lo iface ens3 in ...
- SQL常用条件操作符
1.SQL的六类内容: (1)数据定义语言(DDL): 创建.删除表结构的语句,包括Create.Drop (2)数据控制语言(DCL): 为定义数据访问及修改权限而实现的语句,包括Grant.Rev ...
- ubantu的下载和在虚拟机VM中的安装
一.下载Ubuntu镜像文件 下载地址:http://www.ubuntu.com 打开上面的连接,我们来到如下页面,点击download: 下一步,到如下页面,点击Ubuntu Desktop: 然 ...
- 7.25 6figting!
TEXT 82 Proton 马来西亚宝腾汽车 A fork in the road 何去何从?(陈继龙编译) Nov 30th 2006 | HONG KONG From The Economist ...
- 理解C# 4 dynamic(4) – 让人惊艳的Clay(转)
作者:Justrun名字来自<阿甘正传>,是希望自己能够更更傻一点. link: http://www.cnblogs.com/JustRun1983/p/3529157.html 理 ...
- javascript数组操作(创建、元素删除、数组的拷贝)
这篇文章主要介绍了javascript数组操作,包括创建.元素的访问.元素删除.数组的拷贝等操作,还有其它示例,需要的朋友可以参考下 1.数组的创建 复制代码 代码如下: var arrayObj = ...
- 多产生半成品工单的问题 修改带SO的半成品工单无法分配给SO的问题的
原因:验货及VIP带SO的半成品MO无法分配给对应的SO问题, 解决: SELECT SL.ENTERPRISE , SL.ENGINE_ID , SL.SITEID , ML.MO_ID || '_ ...
- node升级更新最近稳定版
今天,又发现一个超级简单的升级Node.js的方法.一行命令搞定,省去了重新编译安装的过程. node有一个模块叫n(这名字可够短的...),是专门用来管理node.js的版本的. 首先安装n模块: ...