- 浏览: 1634773 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
标准I/O
Buffered I/O:
Buffered I/O可以减少系统调用的次数,提高性能。每次读一个block的整数倍可以提高效率。
1、Standard I/O:
C语言的标准IO库stdio,提供了跨平台的,user-buffering的方案。
2、文件指针:
标准I/O不直接操作文件描述符,而是使用文件指针来操作文件。
FILE *fp
打开的文件被称为流,输入流、输出流、输入/输出流
3、打开文件:
mode描述了如何打开由path代表的文件:
r:打开文件,可读,流的位置在文件的开头
r+:打开文件,可读写,流的位置在文件的开头
w: 打开文件,可写,如果存在,清空。不存在创建,流的位置在文件的开头
w+:打开文件,可读写,如果存在,则清空,如果不存在则创建,流的位置在文件的开头
a:append模式,可写,如果不存在创建。流的位置在文件的末尾。
a+:append模式,可读写,如果不存在创建。流的位置在文件的末尾。
例子:
4、通过文件 描述符打开:
mode的含义和fopen一样,除了w、w+不会清空文件。
例子:
一个可读的fd,如果fdopen设置mode是w,会如何?二者不一致会返回NULL,并设置
errno为EIVAL.
5、关闭流:
fclose可以关闭文件。
buffer和没有写的数据首先被fushed。成功返回0,失败返回EOF。
6、关闭所有的流:
fcloseall关闭当前进程所有的流:
总是返回0。
7、从流中读:
1)一次读一个字符:
fgetc:
返回读取字符转换成了int值,主要由于考虑文件结尾返回EOF,-1不在assci码范围。
2)将字符压回流:
ungetc:
通过这个函数可以peek流中的字符,如果读超过了需要的字符,可以把
这个字符压回。
成功返回c,失败返回EOF
3)读取一行:
fgets可以读取一行字符串:
读取遇到换行或者EOF,成功返回str,失败返回NULL。
例子:
4)读二进制数:
fread:
可以读取复杂的二进制数,比如c中的结构体。
读nr个数据,每一个大小为size字节。成功返回读取元素的个数,失败指示错误或者返回EOF,
但是如果不使用ferror()和feof()无法区分。
由于在不同机器的变量大小,对其,补齐,字节序不同,不具有跨机器性。
例子:
8、写入流:
1)写入一个字符:
成功返回c,失败返回EOF。
2)写入一个字符串:
fputs:
2)写入由\0结尾的字符串,成功返回非负数,失败返回EOF。
例子:
3)写入二进制数据:
fwrtie可以将复杂的结构数据存储到文件中:
将右buf指向的数据写入文件fp中nr个元素,每一个元素的长度是size字节。
9、使用Buffered I/O 例子:
10、Seeking a Stream
1)fseek和标准IO lseek类似:
whence可以取:SEEK_SET、SEEK_CUR,SEEK_END,和lseek含义一样。
2)fsetpos:
和fseek将whence设置成SEEK_SET一样。
3)rewind:
将文件位置重置,相当于fseek(fp,0,SEEK_SET);
rewind 没有返回值,可以通过errno来判断是否成功:
11、获取当前文件流的位置:
1)ftell:
成功返回位置,失败返回-1,errno被设置。
2)fgetpos:
成功返回0,并设置pos,失败返回-1。
12、flush a Stream:
fflush:
所有由fp标示的未写入的数据写入内核的buffer中。
成功返回0,失败返回EOF,并设置errno
write都会写入用户的buffer中,fflush可以将用户buffer的数据,写入内核buffer中,
并不能保证写入磁盘。
13、错误和文件结尾:
一些标准的I/O比如fread,没有提供区分error和EOF的机制,所以检查所给的流确定遇到错误还是文件
结尾很有用。标准I/O提供了两个接口:
1)ferror:
返回非0表示设置了错误,0表示没有。
2)feof
测试流是否设置了EOF,返回非零表示设置,0表示没有。
3)清除错误和EOF设置:
例子:
14、获得相关的文件描述符:
成功返回相关的文件描述符,失败返回-1
混用标准I/O和IO系统调用并不是值得推荐的。
15、控制buffer:
a、标准I/O实现了三种用户Buffer:
1)Unbuffered:
没有缓存,数据直接交给内核。stderr默认使用这种方式。
2)Line-buffered:
buffer缓存一行,当遇到换行符则提交给内核。stdout默认使用这种方式。
3)Block-buffered
与文件相关的I/O默认都是Block-buffered。
b、设置流的buffer类型:
setvbuf:
mode:
_IONBF: 没有buffer
_IOLBF: Line-buffered
_IOFBF: block-buffered/full buffered
除了_IONBF外,其他的两个,都需要用户提供一个size自己的buf。
提供的buffer在文件关闭的时候仍然要可见,否则显示的关闭操作会失败。
下面例子存在bug:
程序退出的时候会隐式的关闭文件,导致失败。可以在上面程序return之前加上显示的close关闭stdout,或者
使用全局的buf。
16、格式化I/O:
1)使用可变参数族:
2)使用va_list族:
va_list在<stdarg.h>中定义。
17、格式化输入:
1)使用可变参数族:
2)使用va_list族
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
Buffered I/O:
Buffered I/O可以减少系统调用的次数,提高性能。每次读一个block的整数倍可以提高效率。
1、Standard I/O:
C语言的标准IO库stdio,提供了跨平台的,user-buffering的方案。
2、文件指针:
标准I/O不直接操作文件描述符,而是使用文件指针来操作文件。
FILE *fp
打开的文件被称为流,输入流、输出流、输入/输出流
3、打开文件:
#include <stdio.h> FILE *fopen(const char *path, const char *mode);
mode描述了如何打开由path代表的文件:
r:打开文件,可读,流的位置在文件的开头
r+:打开文件,可读写,流的位置在文件的开头
w: 打开文件,可写,如果存在,清空。不存在创建,流的位置在文件的开头
w+:打开文件,可读写,如果存在,则清空,如果不存在则创建,流的位置在文件的开头
a:append模式,可写,如果不存在创建。流的位置在文件的末尾。
a+:append模式,可读写,如果不存在创建。流的位置在文件的末尾。
例子:
File *fp; fp = fopen("/etc/manifest","r"); if(! fp ) /* error */
4、通过文件 描述符打开:
#include <stdio.h> FILE *fdopen(int fd, const char *mode);
mode的含义和fopen一样,除了w、w+不会清空文件。
例子:
FILE *fp; int fd; fd = open("/home/kidd/map.txt",O_RDONLY); if(fd == -1) /* error */ fp = fdopen(fd,"r"); if(!fp) /* error */
一个可读的fd,如果fdopen设置mode是w,会如何?二者不一致会返回NULL,并设置
errno为EIVAL.
5、关闭流:
fclose可以关闭文件。
#include <stdio.h> int fclose(FILE *fp);
buffer和没有写的数据首先被fushed。成功返回0,失败返回EOF。
6、关闭所有的流:
fcloseall关闭当前进程所有的流:
#define _GNU_SOURCE #include<stdio.h> int fcloseall(void);
总是返回0。
7、从流中读:
1)一次读一个字符:
fgetc:
#include <stdio.h> int fgetc(FILE *fp);
返回读取字符转换成了int值,主要由于考虑文件结尾返回EOF,-1不在assci码范围。
int c; while((c = fgetc(fp) != EOF){ printf("%c\n",(char)c); }
2)将字符压回流:
ungetc:
通过这个函数可以peek流中的字符,如果读超过了需要的字符,可以把
这个字符压回。
#include <stdio.h> int ungetc(int c, FILE *fp);
成功返回c,失败返回EOF
3)读取一行:
fgets可以读取一行字符串:
#include <stdio.h> char * fgets(char *str,int size, FILE *stream);
读取遇到换行或者EOF,成功返回str,失败返回NULL。
例子:
char buf[LINE_MAX];//LINE_MAX in <limits.h>du if(!fgets(buf,LINE_MAX,fp) /* error */
4)读二进制数:
fread:
#include <stdio.h> size_t fread(void *buf, size_t size, size_t nr, FILE *fp);
可以读取复杂的二进制数,比如c中的结构体。
读nr个数据,每一个大小为size字节。成功返回读取元素的个数,失败指示错误或者返回EOF,
但是如果不使用ferror()和feof()无法区分。
由于在不同机器的变量大小,对其,补齐,字节序不同,不具有跨机器性。
例子:
char buf[64]; size_t nr; nr = fread(buf,sizeof(buf),1,fp); if(nr == 0) /* error */
8、写入流:
1)写入一个字符:
#include <stdio.h> int fputc(int c, FILE *fp);
成功返回c,失败返回EOF。
if( fputc('p',fp) ) /* error */
2)写入一个字符串:
fputs:
#include <stdio.h> int fputs(const char *str, FILE *stream);
2)写入由\0结尾的字符串,成功返回非负数,失败返回EOF。
例子:
FILE *fp; if(!(fp = fopen("journal.txt","a")) /* error */ if(fputs("The ship is made of wood.\n",fp) == EOF) /*error*/ if(fclose(fp) == EOF) /*error*/
3)写入二进制数据:
fwrtie可以将复杂的结构数据存储到文件中:
#include <stdio.h> size_t fwrite(void *buf,size_t size, size_t nr, FILE *fp);
将右buf指向的数据写入文件fp中nr个元素,每一个元素的长度是size字节。
9、使用Buffered I/O 例子:
#include <stdio.h> int main(void){ FILE *in,*out; struct pirate{ char name[100]; unsigned long booty; unsigned int beard_len; }p,blackbeard = {"Edward Teach",950,48}; out = fopen("data","w"); if(! out ){ perror("fopen"); return 1; } if(!fwrite(&blackbeard,sizeof(struct pirate),1,out)){ perror("fwrite"); return 1; } if(fclose(out)){ perror("fclose"); return 1; } in = fopen("data","r"); if( !in ){ perror("fopen"); return 1; } if(! fread(&p, sizeof(struct pirate),1,in)){ perror("fread"); return 1; } if(fclose(in)){ perror("fclose"); return 1; } printf("name=\"%s\" booty=%lu beard_len=%u\n",p.name,p.booty,p.beard_len); return 0; }
10、Seeking a Stream
1)fseek和标准IO lseek类似:
#include <stdio.h> int fseek(FILE *fp,long offset, int whence);
whence可以取:SEEK_SET、SEEK_CUR,SEEK_END,和lseek含义一样。
2)fsetpos:
#include <stdio.h> int fsetpos(FILE *fp,fpos_t *pos);
和fseek将whence设置成SEEK_SET一样。
3)rewind:
将文件位置重置,相当于fseek(fp,0,SEEK_SET);
#include <stdio.h> void rewind(FILE *fp);
rewind 没有返回值,可以通过errno来判断是否成功:
errno = 0; rewind(stream); if(errno) /* error */
11、获取当前文件流的位置:
1)ftell:
#include <stdio.h> long ftell(FILE *stream);
成功返回位置,失败返回-1,errno被设置。
2)fgetpos:
#include <stdio.h> int fgetpos(FILE *stream, fpos_t *pos);
成功返回0,并设置pos,失败返回-1。
12、flush a Stream:
fflush:
#include <stdio.h> int fflush(FILE *fp);
所有由fp标示的未写入的数据写入内核的buffer中。
成功返回0,失败返回EOF,并设置errno
write都会写入用户的buffer中,fflush可以将用户buffer的数据,写入内核buffer中,
并不能保证写入磁盘。
13、错误和文件结尾:
一些标准的I/O比如fread,没有提供区分error和EOF的机制,所以检查所给的流确定遇到错误还是文件
结尾很有用。标准I/O提供了两个接口:
1)ferror:
#include <stdio.h> int ferror(FILE *fp);
返回非0表示设置了错误,0表示没有。
2)feof
#include <stdio.h> int feof(FILE *fp);
测试流是否设置了EOF,返回非零表示设置,0表示没有。
3)清除错误和EOF设置:
#include<stdio.h> void clearerr(FILE *fp);
例子:
if(ferror(f)) printf("Error on f!\n"); if(feof(f)) printf("EOF on f!\n"); clearerr(f);
14、获得相关的文件描述符:
#include <stdio.h> int fileno(FILE *fp);
成功返回相关的文件描述符,失败返回-1
混用标准I/O和IO系统调用并不是值得推荐的。
15、控制buffer:
a、标准I/O实现了三种用户Buffer:
1)Unbuffered:
没有缓存,数据直接交给内核。stderr默认使用这种方式。
2)Line-buffered:
buffer缓存一行,当遇到换行符则提交给内核。stdout默认使用这种方式。
3)Block-buffered
与文件相关的I/O默认都是Block-buffered。
b、设置流的buffer类型:
setvbuf:
#include <stdio.h> int setvbuf(FILE *stream, char *buf, int mode, size_t size);
mode:
_IONBF: 没有buffer
_IOLBF: Line-buffered
_IOFBF: block-buffered/full buffered
除了_IONBF外,其他的两个,都需要用户提供一个size自己的buf。
提供的buffer在文件关闭的时候仍然要可见,否则显示的关闭操作会失败。
下面例子存在bug:
#include <stdio.h> int main(void){ char buf[BUFSIZ]; setvbuf(stdout,buf,_IOFBF,BUFSIZ); printf("Arrr!\n"); return 0; }
程序退出的时候会隐式的关闭文件,导致失败。可以在上面程序return之前加上显示的close关闭stdout,或者
使用全局的buf。
16、格式化I/O:
1)使用可变参数族:
#include <stdio.h> //正确返回输出的字节数,错误返回-1 int printf(const char *restrict format, ...); int fprintf(FILE *restrict fp, const char * restrict format,...); //调用者需要确保buf足够大,不会溢出, int sprintf(char *restrict buf,const char * restrict format,...); //显示指定了buf的大小,多出来的会被抛弃 int snprintf(char *restrict buf, size_t n, const char *restrict format,...); //正确返回输出到数组buf中的字节数,错误返回-1。
2)使用va_list族:
va_list在<stdarg.h>中定义。
#include <stdio.h> #include <stdarg.h> int vprintf(const char *restrict format, va_list arg); int vfprintf(FILE *restrict fp, const char * restrict format,va_list arg); int vsprintf(char *restrict buf,const char * restrict format,va_list arg); int vsnprintf(char *restrict buf, size_t n, const char *restrict format,va_list arg);
17、格式化输入:
1)使用可变参数族:
#include <stdio.h> int scanf(const char *restrict format,...); int fscanf(FILE * restrict fp, const char * restrict format,...); int sscanf(const char *restrict buf, const char *restrict format,...);
2)使用va_list族
#include <stdio.h> #include <stdarg.h> int vscanf(const char *restrict format,va_list arg); int vfscanf(FILE * restrict fp, const char * restrict format,va_list arg); int vsscanf(const char *restrict buf, const char *restrict format,va_list arg);
参考:
1、《Linux system programming》
2、《Unix system programming》
3、《Advanced Programming in the Unix Environment》
发表评论
-
【zz】Vim的分屏
2012-04-26 11:13 1542分屏启动Vim 使用大写 ... -
bash的几种for循环
2012-04-26 11:13 17751、罗列式 for VARIABLE in 1 2 3 ... -
【zz】几个简单选项让你的Readline(Bash)更好用
2011-10-10 23:08 2371Reddit上的一位仁兄贴出了他的readline手册学习成果 ... -
pipe in -exec
2011-09-27 22:35 1380一个简单的例子: 将一堆的.txt文件,合并成一个文件,让每个 ... -
[zz]Unix调试的瑞士军刀:lsof
2011-08-31 10:33 1460原文见:http://heikezhi.com/2011/06 ... -
[zz]关于xargs,你可能不知道的
2011-08-29 23:05 2417如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过x ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6433在Java中我们可以使用Runtime.getRuntime( ... -
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
2011-06-23 22:17 14381在笔记本安装Ubuntu11.04增强功能失败 引用 fuli ... -
awk getline
2011-06-02 23:58 5770awk getline开始一直用做按行读取文件。 getlin ... -
[zz]服务器性能评估
2011-04-29 14:17 3979工作这么久了,主 ... -
[zz]Top命令VIRT,RES,SHR,DATA的含义
2011-04-10 15:50 4053VIRT:virtual memory usage ... -
[zz]一些shell命令
2011-04-10 15:35 14571.显示消耗内存/CPU最多的10个进程 ps aux | ... -
Open VPN免密码配置
2011-03-03 22:55 3589公司VPN的帐号密码使用的是个超长的随机数,每次输入很麻烦,如 ... -
Linux下使用RTX腾讯通
2011-03-03 22:46 10733在公司为了使用RTX,专门安装了一个XP的虚拟机,但是这个也不 ... -
[zz]linux 常用命令总结:
2010-12-11 21:30 1650linux 常用命令总结: 一。 通用命令: 1. dat ... -
Ubuntu10.10解决Empathy无法链接MSN的问题
2010-10-21 16:36 37121.在Empathy中删除无法登录的MSN账户,并关闭Empa ... -
[zz]Vim的分屏功能
2010-10-21 13:09 1635分屏启动Vim 使用大写 ... -
Ubuntu10.10 64bit使用Eclipse插件subclipse问题
2010-10-20 20:32 1927升级到ubuntu10.10什么坑都碰到了,郁闷啊。发现sub ... -
scim输入法,Eclipse代码提示之后失去焦点的问题
2010-10-20 13:36 3049突然发现Eclipse,每次代码提示之后无法打字,感觉是文本域 ... -
Linux下使用谷歌输入法
2010-10-18 23:01 3069Linux的中文输入法一直太烂,scim终于出来对google ...
相关推荐
Linux系统编程笔记.pdfLinux系统编程笔记.pdfLinux系统编程笔记.pdfLinux系统编程笔记.pdf
GUN/LINUX系统编程学习笔记,分享快乐。
Linux系统编程是指在Linux操作系统上进行程序开发的一种形式。它涵盖了多个方面,包括文件操作、进程管理、内存管理、网络编程等。...Linux 系统编程通常需要直接调用系统调用,使用 C 或 C++ 等低级编程语言进行开发。
linux系统 编程 开发 笔记 如果 大家 需要 可以 下载 看看 啊 希望 对你 linux 系统学习 有一定的 帮助 啊
linux系统管理学习笔记 linux系统管理学习笔记 linux系统管理学习笔记
Linux系统编程笔记,C语言编程的常见错误、常用函数、I/O等
linux系统编程笔记
GNU_LINUX 系统编程笔记.pdf
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
Java I/O详细笔记
Java I/O学习笔记: 磁盘操作 字节操作 字符操作 对象操作 网络操作 NIO & AIO Java I/O Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,意味着可以在不同的操作系统上运行...
尚观 linux内核驱动开发 笔记 系统编程部分 绝对值得研究!
linux编程学习笔记PDF资料下载
C语言实现的Linux系统编程课程作业代码及学习笔记 介绍 陈悦老师的“Linux系统编程”课对应的仓库,存放一些上课的代码以及资料等。 (1)文件存放位置 code 使用阿里云的轻量级应用服务器,文件统一放在 /home/...
linux socket网络编程笔记自己整理的。
Linux系统在科学计算、数据分析和机器学习等领域也有广泛应用。许多知名的科学计算软件都在Linux上开发和运行,Linux系统在各个领域都有广泛的应用,其强大的功能和灵活性使得它成为许多产品和服务的基础架构。
C语言学习笔记C语言学习笔记C语言学习笔记C语言学习笔记