标准I/O库是ISO C的标准,在很多操作系统上面都实现。Unix文件I/O函数都是针对文件描述符的,当打开一个文件的时候,返回该文件描述符用于后续的I/O操作。而对于标准I/O库,操作则是围绕流进行,当用标准I/O库打开或者创建一个文件时,使得一个流与文件相关联。标准I/O库使用了缓冲技术,使用缓冲的目的是尽可能减少使用read和write调用次数,但是效率不高。每次进行读写时候需要复制两次数据。第一次是在内核和标准I/O缓冲之间(调用read和write),第二次是在标准I/O缓冲区和用户程序中的行缓冲区之间。提供了三种类型的缓冲:全缓冲、行缓冲和不带缓冲。标准I/O预定义三个文件指针stdin、stdout和stderr。

  当一个流最初被创建的时候,没有定向。可以用fwide函数设置流的定向,freopen函数清除一个流的定向。采用setbuf和setvbuf函数更改缓冲区类型,fflush函数冲洗一个流。

int fwide(FILE *stream, int mode); //若流是宽字符定向则返回正值,若是字节定向则返回负值,如实为定向的则返回0
void setbuf(FILE *stream, char *buf);
int setvbuf(FILE *stream, char *buf, int mode, size_t size);  
_IONBF  unbuffered  _IOLBF  line buffered  _IOFBF  fully buffered
int fflush(FILE *fp);
 
I/O操作函数:
FILE *fopen(const char *path, const char *mode);  //打开一个指定的文件
FILE *fdopen(int fd, const char *mode);  //获取一个现有的文件描述符,使得一个I/O流与该描述符先结合,常用于由创建管道和网络通信通道函数返回的描述符。
FILE *freopen(const char *path, const char *mode, FILE *stream);//在一个指定的流上打开一个指定的文件
int fclose(FILE* fp);
 
一次读取一个字符
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);
 
一次读取一行
char *fgets(char *s, int size, FILE *stream);
char *gets(char *s);
 
一次写一个字符
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);
 
一次写入一行
int fputs(const char *s, FILE *stream);
int puts(const char *s);
 
针对二进制I/O,一般是结构体类型
size_t fread(void *ptr, size_t size, size_t nmembFILE *" stream );
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
 
文件定位函数
int fseek(FILE *stream, long offset, int whence); //设置文件的位置
long ftell(FILE *stream);  //返回当前文件的位置指示
void rewind(FILE *stream);  //将一个流的位置设置到文件的开始位置
int fgetpos(FILE *stream, fpos_t *pos); 
int fsetpos(FILE *stream, fpos_t *pos);
fgetpos函数将文件指示器的当前值存入有pos指向的对象中,在以后调用fsetpos时,可以使用此值将流重新定位到该位置。
 
格式化I/O:
#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>
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
 
#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 ap);
int vsscanf(const char *str, const char *format, va_list ap);
int vfscanf(FILE *stream, const char *format, va_list ap);
 
在Unix系统中,标准I/O库最终都要调用文件I/O,每个标准I/O流都有一个与其相关联的文件描述符。一个流可以通过调用fileno函数获取其描述符。
int fileno(FILE *fp)  //在调用dup和fcntl函数的时候用到
临时文件创建函数tmpnam和tepfile
char *tmpnam(char *s);
FILE *tmpfile(void);
针对标准I/O写个程序进行练习,程序如下:
 1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <wchar.h>
5
6 #define BUFSIZE 1024
7
8 int main()
9 {
10 char *filename = ".//test.log";
11 char buf[BUFSIZE];
12 char line[100];
13 FILE *fp;
14 memset(line,0,100);
15 //打开文件,不存在则创建
16 fp = fopen(filename,"w+");
17 if(fp == NULL)
18 {
19 perror("fopen() error");
20 exit(-1);
21 }
22 //设置为字节宽度
23 if(fwide(fp,-1) < 0)
24 printf("byte stream\n");
25 //设置为行缓冲
26 setvbuf(fp,buf,_IOLBF,BUFSIZE);
27 printf("Enter file content:\n");
28 gets(line);
29 printf("write to file.\n");
30 fputs(line,fp);
31 close(fp);
32 fp = fopen(filename,"r+");
33 if(fp == NULL)
34 {
35 perror("fopen() error");
36 exit(-1);
37 }
38 printf("read from file.\n");
39 fgets(line,99,fp);
40 printf("%s\n",line);
41 close(fp);
42 return 0;
43 }

测试结果如下:

Unix环境高级编程(三)标准I/O库的更多相关文章

  1. Unix环境高级编程(二十一)数据库函数库

    本章的内容是开发一个简单的.多用户数据库的C函数库.调用此函数库提供的C语言函数,其他程序可以读取和存储数据库中的记录.绝大部分商用数据库函数库提供多进程同时更新数据库所需要的并发控制,采用建议记录锁 ...

  2. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  3. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. 【转】apue《UNIX环境高级编程第三版》第一章答案详解

    原文网址:http://blog.csdn.net/hubbybob1/article/details/40859835 大家好,从这周开始学习apue<UNIX环境高级编程第三版>,在此 ...

  5. UNIX环境高级编程---标准I/O库

    前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压 ...

  6. UNIX环境高级编程(第三版)关于apue.h的用法

    UNIX环境高级编程(第三版)中的例子用到apue.h这个头文件,但是书里面写的地址已经不能访问. 经过一番查找之后,找到如下解决方案: 1.到www.apuebook.com上下载第2版的源码,也可 ...

  7. Unix环境高级编程第三版中实例代码如何在自己的linux上运行的问题

    学习Linux已经有2个月了,最近被期末考试把进度耽误了,前几天把Unix环境高级编程看了两章,感觉对Linux的整体有了一些思路,今天尝试着对第一章涉及到的一个简单的交互式shell编译运行一下,结 ...

  8. Linux - Unix环境高级编程(第三版) 代码编译

    Unix环境高级编程(第三版) 代码编译 本文地址:http://blog.csdn.net/caroline_wendy 时间:2014.10.2 1. 下载代码:http://www.apuebo ...

  9. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. DIV-CSS布局中position属性详解

    本文向大家描述一下DIV CSS布局中的position属性的用法,position属性主要有四种属性值,任何元素的默认position的属性值均是static,静态.这节课主要讲讲relative( ...

  2. vue组件级路由钩子函数介绍,及实际应用

    正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消. 有多种方式可以在路由导航发生时执行钩子:全局的.单个路由独享的.或者组件级的. 一.全局钩子 你可以使用 rout ...

  3. php CURL 请求头和响应头获取

    1.从CURL中获取响应头 $oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网址是否有对应的要求 $header[] = "Content-ty ...

  4. PL/SQL 下 Command window 与 SQL window 的区别

    1.Command window实现了SQL*Plus的所有功能,允许运行sql*plus命令,sql命令,sql脚本. 2.SQL window用于执行sql语句,显示sql输出,执行统计信息.(测 ...

  5. dxg:TreeListView.RowDecorationTemplate

    <dxg:TreeListView.RowDecorationTemplate> <ControlTemplate TargetType="ContentControl&q ...

  6. WordPress 后台评论如何自定义搜索条件

    大家都知道WordPress 作为一个非常成熟的博客系统,功能可以说是非常强大,几乎整个网站都可以进行定制开发,已经不算是一个博客系统了而应该是一个成熟的开发框架 最近就用WP给客户开发了一个网站,但 ...

  7. Android Studio 3.0 下载 使用新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  8. 【leetcode 桶排序】Maximum Gap

    1.题目 Given an unsorted array, find the maximum difference between the successive elements in its sor ...

  9. C#.NET常见问题(FAQ)-如何修改代码字体

    工具-选项-字体和颜色     更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com/acetaohai123   我的在线论坛: http://csrob ...

  10. ZH奶酪:PHP中添加HTML代码的三种方法

    php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...