Record and Summarize

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、main函数
(1)两种形式
  无参形式:int main( void )
  有参形式:int main( int argc, char *argv[] )
  除此之外,不存在其他形式。
(2)返回值
  联想linux下命令的返回值,若正常结束,则返回0;否则返回其他。
  使用echo $?得到上一条命令的返回值。

2、int remove(const char *filename)
(1)说明
  删除一个文件,但是如果它的filename参数是一个目录的话,其作用就相当于rmdir函数,即仅能删除空目录。
(2)返回值
  如果删除成功,remove返回0,否则返回EOF(-1)

3、FILE * fopen(const char * path,const char * mode)
(1)返回值
  文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL。一般在fopen()后作错误判断及处理。
(2)mode参数
  mode有下列几种形态字符串:
  r 以只读方式打开文件,该文件必须存在。
  w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
  上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。

4、int fclose(FILE *stream)
(1)作用:关闭一个流。
  注意:使用fclose()函数就可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
(2)返回值
  如果流成功关闭,fclose 返回 0,否则返回EOF(-1)。
  如果流为NULL,而且程序可以继续执行,fclose设定error number给EINVAL,并返回EOF。

5、EOF和feof函数
  EOF是文本文件结束的标志。在文本文件中,数据是以字符的ASCⅡ代码值的形式存放,普通字符的ASCⅡ代码的范围是32到127(十进制),因此可以用EOF作为文件结束标志。
  当把数据以二进制形式存放到文件中时,就会有-1值的出现,此时不能采用EOF作为二进制文件的结束标志。为解决这个问题,ANSI C提供一个feof函数,用来判断文件是否结束。如果遇到文件结束,函数feof(fp)的值为1,否则为0。feof函数既可用以判断二进制文件是否结束,也可以用以判断文本文件是否结束。

  注意,大多数文本编辑器都会在单行的最后加上一个换行符,即使用户没有要求换行,因此,在EOF之前,通常会出现一个ASCII等于10的换行符。

6、int fprintf(FILE *stream,char *format,[argument])
(1)返回值
  若成功则返回输出字符数,若输出出错则返回负值。
(2)参数
  对于参数,它与printf()函数相比多出来了第一个参数FILE *stream,其意义是将打印的内容输出到文件流指针stream指向的流。C语言提供了5种标准的流,你的程序在任何时候都可以使用它们,并且不必打开或关闭它们。以下列出了这5种标准的流:

名称       描述          例子
stdin      标准输入        键盘
stdout      标准输出        屏幕
stderr      标准错误        屏幕
stdprn      标准打印机       LPT1端口
stdaux    标准串行设备               COM1端口

  其中,stdprn和stdaux并不总是预先定义好的,因为LPT1和COM1端口在某些操作系统中是没有意义的,而stdin,stdout 和stderr总是预先定义好的。此外,stdin并不一定来自键盘,stdout也并不一定显示在屏幕上,它们都可以重定向到磁盘文件或其它设备上。我们在头文件stdio.h中可以找到stdin,stdout 和stderr的定义如下:

/* Standard streams. */
extern struct _IO_FILE *stdin; /* Standard input stream. */
extern struct _IO_FILE *stdout; /* Standard output stream. */
extern struct _IO_FILE *stderr; /* Standard error output stream. */
typedef struct _IO_FILE FILE;

  在使用fprintf()函数时,通常我们可以将第一个参数设为stdout或者stderr,打印出错调试信息的时候则推荐使用stderr而不是 stdout,这是一种惯例,同时也由于内核在处理stdout和stderr时的优先级不一样,后者的优先级要高一些,因此有时候如果程序异常退出时,stderr能得到输出,而stdout就不行。
  除此之外,还要提一下,标准输入(standard input)的文件描述符是 0,标准输出(standard output)是 1,标准错误(standard error)是 2。这样就可以与shell的命令cat关联起来,一些常用的shell I/O语法如下:

cmd > file 把 stdout 重定向到 file 文件中 
cmd >> file 把 stdout 重定向到 file 文件中(追加) 
cmd 1> file 把 stdout 重定向到 file 文件中 
cmd > file 2>&1 把 stdout 和 stderr 一起重定向到 file 文件中 
cmd 2> file 把 stderr 重定向到 file 文件中 
cmd 2>> file 把 stderr 重定向到 file 文件中(追加) 
cmd >> file 2>&1 把 stderr 和 stderr 一起重定向到 file 文件中(追加) 

  还需要注意一点:stdout和stderr是不同设备描述符。stdout是块设备,stderr则不是。对于块设备,只有当下面几种情况下才会从缓冲区中输出,1)遇到回车,2)缓冲区满,3)fflush被调用。而stderr则不会。

(3)printf
  它是将输出到stdout的fprintf。因此也要注意上面红字部分。

7、int snprintf(char *str, size_t size, const char *format, ...);
(1)说明
  主要功能是把格式化的数据写入某个字符串中。不要使用不安全的sprintf
(2)参数和返回值

  • 如果格式化后的字符串长度 < size,则将此字符串全部复制到str中,并给其后添加一个字符串结束符('\0');
  • 如果格式化后的字符串长度 >= size,则只将其中的(size-1)个字符复制到str中,并给其后添加一个字符串结束符('\0')

  返回格式化后的字符串的长度。

8、int fscanf(FILE *stream, char *format,[argument...]);
(1)说明:
  从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。
(2)返回值
  返回值是[argument...]的个数,注意不是字符串的长度。若未读到任何值,则返回EOF。
(3)亮点
  这个函数在读取多行有规律的数据(类似数据库的存储形式)时,非常有效。
  同时fscanf和sscanf可以使用自身具有的正则表达式,这个很有用。


9、int sscanf(const char *buffer,const char *format,[argument ...]);
(1)说明
  从一个字符串中读进与指定格式相符的数据.
(2)参数和返回值
  buffer 存储的数据
  format 格式控制字符串
  argument 选择性设定字符串
  sscanf会从buffer里读进数据,依照argument的设定将数据写回。
  成功则返回[argument...]的个数,若未读到任何值,则返回EOF。

10、int fgetc(FILE *stream)
(1)返回值
  fgetc()从参数stream所指的文件中读取一个字符,并把它作为一个字符返回。若读到文件尾或出现错误时,它就返回EOF,你必须通过ferror或feof来区分这两种情况。
(2)getc
  此函数被ISO C声明为一个宏,所以在用时不能将其做为函数指针传(有一些编译器将其以函数形式也给另说)。而且,调用getc函数时所用的参数fp不能是有副作用的表达式。注:副作用表达式指,表达式会造成变量本身的改变,例如i++。因此,不要用getc。


11、int fputc (char ch, File *fp)
(1)说明
  将字符ch写到文件指针fp所指向的文件的当前写指针的位置。
(2)返回值
  在正常调用情况下,函数返回读取字符的ASCII码值,出错时,返回EOF(-1)。

12、char *fgets(char *s, int n, FILE *stream);
(1)说明
  fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符(注意:读入的字符串中最后包含读到的换行符,即最后会加入”\n\0”)、读到文件尾或是已读了n-1个字符为止,最后会加上NULL作为字符串结束。
(2)参数和返回值
  *s:字符型指针,指向将存储到的数据地址。
  n:整型数据,将从流中读取n-1个字符。
  *stream:指针数据,欲读取的流。
  如果成功则返回s的指针,否则返回NULL(即未读到任何字符)。
(3)补充
  不要再用gets,gets的功能完全可以由fgets做到,并且gets是不安全的。

13、int fputs(char *str, FILE *fp)
(1)说明
  向指定的文件写入一个字符串(不自动写入字符串结束标记符‘\0’)。
(2)返回值
  成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负值;否则返回EOF(符号常量,其值为-1)。

14、int fflush(FILE *stream)
(1)说明
  清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件
(2)返回值
  如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
  注意:如果fflush返回EOF,数据可能由于写错误已经丢失。当设置一个重要错误处理器时,最安全的是用setvbuf函数关闭缓冲或者使用低级I/0例程,如open、close和write来代替流I/O函数。
(3)补充
  fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上。
  fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准](不要使用)。
  注意:C和C++的标准里从来没有定义过 fflush(stdin)。也许有人会说:“可是我用 fflush(stdin) 解决了这个问题,你怎么能说是错的呢?”的确,某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux下的gcc就不支持,已经测试过),因为标准中根本没有定义 fflush(stdin)。

15、void perror(const char *s);
(1)说明
  perror( ) 用来将上一个函数发生错误的原因输出到标准设备stderr。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno 的值来决定要输出的字符串。
(2)补充:char *strerror(int errnum);
  头文件<string.h>
  功能:获取系统错误信息或打印用户程序错误信息。
  返回指向错误信息的指针。
  用法:strerror( errno )即可返回错误字符串,errno 记录系统的最后一次错误代码。只要包含<errno.h>即可使用errno。
(3)perror和strerror的区别
  perror是将errno对应的错误消息的字符串打印到标准错误输出上,即stderr或2上,若你的程序将标准错误输出重定向到/dev/null,那就看不到了,就不能用perror了。而strerror的作用只是将errno对应的错误消息字符串返回,要怎样处理完全由你自己决定。

16、缓冲I/O和非缓冲I/O
(1)先来了解下什么是标准IO以及文件IO。
  标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。

  • 全缓存:当填满标准IO缓存后才进行实际的IO操作。
  • 行缓存:当输入或输出中遇到新行符时,标准IO库执行IO操作。
  • 不带缓存:stderr就是了。

  文件IO:文件IO称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都是系统调用,也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
(2)区别
  首先,两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立 了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过 其实在linix或unix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。
  其次从操作的设备上来区分,文件I/O主要针对文件操作,读写硬盘等,它操作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等,它操作的是字符流。对于不同设备的特性不一样,必须有不同api访问才最高效。
(3)二者使用的函数

  标准IO(stdio.h) 文件IO(低级IO)
打开 fopen,freopen,fdopen  open(fcntl.h)
关闭 fclose close(unistd.h)

getc,fgetc,getchar

fgets,gets

fread

read(unistd.h)

putc,fputc,putchar

fputs,puts

fwrite

write(unistd.h)

 

 

 

 

 

 

 

 

 

 

17、系统调用
  操作系统的主要功能是为应用程序的运行创建良好的环境,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口(函数)呈现给用户。系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处 理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序。
  Linux系统调用,包含了大部分常用系统调用和由系统调用派生出的的函数(这些函数详见百度百科)。

 

posted on 2013-12-30 15:38  zhangjing327  阅读(377)  评论(0编辑  收藏  举报