- 浏览: 1658298 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 1603分屏启动Vim 使用大写 ... -
bash的几种for循环
2012-04-26 11:13 18581、罗列式 for VARIABLE in 1 2 3 ... -
【zz】几个简单选项让你的Readline(Bash)更好用
2011-10-10 23:08 2429Reddit上的一位仁兄贴出了他的readline手册学习成果 ... -
pipe in -exec
2011-09-27 22:35 1433一个简单的例子: 将一堆的.txt文件,合并成一个文件,让每个 ... -
[zz]Unix调试的瑞士军刀:lsof
2011-08-31 10:33 1507原文见:http://heikezhi.com/2011/06 ... -
[zz]关于xargs,你可能不知道的
2011-08-29 23:05 2483如果你曾经花了许多时间在Unix命令行上,那么或许你已经见过x ... -
使用scala.sys.process包和系统交互
2011-07-19 00:00 6501在Java中我们可以使用Runtime.getRuntime( ... -
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法
2011-06-23 22:17 14482在笔记本安装Ubuntu11.04增强功能失败 引用 fuli ... -
awk getline
2011-06-02 23:58 5848awk getline开始一直用做按行读取文件。 getlin ... -
[zz]服务器性能评估
2011-04-29 14:17 4032工作这么久了,主 ... -
[zz]Top命令VIRT,RES,SHR,DATA的含义
2011-04-10 15:50 4133VIRT:virtual memory usage ... -
[zz]一些shell命令
2011-04-10 15:35 15191.显示消耗内存/CPU最多的10个进程 ps aux | ... -
Open VPN免密码配置
2011-03-03 22:55 3589公司VPN的帐号密码使用的是个超长的随机数,每次输入很麻烦,如 ... -
Linux下使用RTX腾讯通
2011-03-03 22:46 10795在公司为了使用RTX,专门安装了一个XP的虚拟机,但是这个也不 ... -
[zz]linux 常用命令总结:
2010-12-11 21:30 1700linux 常用命令总结: 一。 通用命令: 1. dat ... -
Ubuntu10.10解决Empathy无法链接MSN的问题
2010-10-21 16:36 37571.在Empathy中删除无法登录的MSN账户,并关闭Empa ... -
[zz]Vim的分屏功能
2010-10-21 13:09 1708分屏启动Vim 使用大写 ... -
Ubuntu10.10 64bit使用Eclipse插件subclipse问题
2010-10-20 20:32 1974升级到ubuntu10.10什么坑都碰到了,郁闷啊。发现sub ... -
scim输入法,Eclipse代码提示之后失去焦点的问题
2010-10-20 13:36 3095突然发现Eclipse,每次代码提示之后无法打字,感觉是文本域 ... -
Linux下使用谷歌输入法
2010-10-18 23:01 3149Linux的中文输入法一直太烂,scim终于出来对google ...
相关推荐
标准I/O库-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
### Linux系统编程学习笔记 #### 一、IO **1.1 标准I/O (stdio)** - **fopen/fclose**: `fopen` 用于打开或创建一个文件,并返回一个指向该文件的 `FILE *` 类型的指针。`fclose` 用于关闭一个已经打开的文件。...
Linux系统编程笔记涉及到的内容广泛,涵盖了从基础的出错处理到进程管理,从内存管理到进程间通信,以及守护进程设计等多个层面的知识。下面详细说明各个部分的知识点: 1. 常见出错处理 - abort函数用于异常终止...
文件I/O基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
【Linux 系统编程与内核驱动开发笔记】 在深入探讨Linux系统编程和内核驱动开发之前,我们首先要理解Linux操作系统的基本概念。Linux是一种自由、开放源码的类Unix操作系统,广泛应用于服务器、桌面环境以及各种...
深入探究文件 I/O:深入了解了文件 I/O 中的一些细节,譬如文件的管理方式、 错误返回的处理、空洞文件、O_APPEND 和 O_TRUNC 标志、原子操作与竞争冒险等等
8. **系统调用与库函数**:区别系统调用与库函数,理解系统调用接口(如syscalls.h头文件)和C语言标准库(如glibc)的关系。 9. **错误处理**:学会如何使用errno全局变量和perror()函数来识别和处理运行时错误。 ...
5. 标准I/O库:这部分内容是关于C语言中标准I/O库的使用,包括文件流的概念,标准输入输出流stdin、stdout和stderr,标准I/O的缓冲机制,文件流的打开、读写、关闭以及定位操作。还介绍了一些格式化输入输出函数以及...
根据提供的文件信息,我们可以推断出这是一份关于Linux编程学习笔记的PDF资料。下面将对这份资料可能涉及的关键知识点进行详细的阐述。 ### Linux编程基础知识 #### 1. Linux操作系统概述 - **定义与特点**:Linux...
### Linux系统编程笔记知识点概述 #### 一、常见出错处理 在Linux系统编程中,正确处理各种可能发生的错误对于程序的稳定性和可靠性至关重要。以下是一些常用的错误处理方法: ##### 1. `abort` - **定义**:`#...
在进入UNIX系统编程的学习之前,我们首先需要理解UNIX的基本概念。UNIX是一种多用户、多任务的操作系统,由贝尔实验室在1960年代末开发。它以其简洁、强大的命令行接口和丰富的工具集而闻名,是许多现代操作系统设计...
Linux C系统编程是计算机科学领域中的一个重要主题,它涉及到操作系统层面的编程,主要使用C语言在Linux环境下进行。这一主题涵盖了多个关键知识点,包括文件操作、进程管理、内存管理、信号处理、网络编程以及系统...
Framebuffer 是一种显示驱动接口,在 Linux 系统中用于抽象并屏蔽不同显示设备的硬件细节。它通过设备文件(如 /dev/fbX)提供一块显示内存,使应用程序无需关心物理显存的细节。应用程序通过 mmap 将显示缓冲区映射...
自学Linux网络编程关于socket的编写,包括 server.c 和 client.c 的编写;很详细的介绍了网络套接字socket的C/S模型TCP协议的服务器端和客户端的程序函数以及编写过程;重点介绍多路I/O转接服务器的实现,包括select...
应用程序通过对这些设备节点进行I/O操作来配置和使用设备。 摄像头应用编程的步骤包括: 打开设备:使用open函数打开摄像头设备文件。 查询设备属性:使用ioctl()函数查询设备功能,确保其支持视频采集功能。 设置...
5. **网络和I/O**:掌握网络编程的基本概念,如套接字编程,以及如何通过标准输入/输出和文件描述符进行I/O操作。 6. **系统调用与内核接口**:深入理解Linux内核,学习如何使用系统调用编写高效的程序。 压缩包中...
文件编程是Linux编程中的关键部分,涉及到文件I/O、文件权限和文件操作。在Linux中,一切皆为文件,了解如何正确地读写文件、处理错误和重定向输出至关重要。比如,`open`函数用于打开文件,`read`和`write`用于读写...
### Linux编程精髓部分知识点 #### 用户级内存管理 在Linux编程中,用户级内存管理是极为重要的一个方面,它涉及...以上是对“Linux编程精髓部分笔记”所涉及知识点的详细解释和总结,希望对学习Linux编程有所帮助。
在深入探讨Linux嵌入式学习笔记的内容之前,我们先来理解一下这个领域的基本概念。Linux嵌入式系统是指将Linux操作系统内核移植到特定硬件平台上的系统,用于控制或管理设备的各种功能。这类系统广泛应用于各种领域...