C语言之I/O处理函数

一、在Linux的文件系统调用中,所有函数都是根据文件描述符fd来访问文件的,如下:

1 文件描述符的创建和关闭

  • int open(const char *path, int oflag,...); //成功则返回文件描述符fd,出错则返回-1
  • int create(const char *path, mode_t mode); //成功则返回只写打开的文件描述符fd, 出错则返回-1;open(path, O_WRONLY | O_CREAT | O_TRUNC, mode);
  • int close(int fd); //成功则返回0,出错则返回-1;

2 文件的读写

  • ssize_t read(int fd, void *buf, size_t nbytes); //成功则返回读到的字节数,已到文件尾则返回0,出错则返回-1
  • ssize_t write(int fd, void *buf, size_t nbytes); //成功则返回已写的字节数,出错则返回-1

3 文件的定位

  • off_t lseek(int fd, off_t offset, int whence); //成功则返回文件偏移量,出错则返回-1;whence: SEEK_SET, SEEK_CUR, SEEK_END;

二、为了支持跨平台(Linux+Windows),一般使用C语言的标准I/O库,它是通过流来访问文件的,而且标准I/O库提供多种缓冲机制:

  • 全缓冲:只有填满了缓冲区后才进行实际的I/O操作,比如fread、fwrite等;
  • 行缓冲:遇到换行符后执行I/O操作,比如stdin、stdout;
  • 不带缓冲:遇到字符就立即执行I/O操作,比如stderr;

1 流的打开和关闭

  • FILE *fopen(const char *path, const char *type); //成功则返回文件指针,出错则返回NULL;type:r读,w写,a追加写,+读写,b二进制
  • int fclose(FILE *fp); //成功则返回0,出错则返回EOF;

2 读写一个字符的I/O流

  • int fgetc(FILE *fp); //成功则返回下一个字符,已到文件尾或出错则返回EOF;
  • int fputc(int c, FILE *fp) //成功则返回c,出错则返回EOF;
  • int getc(FILE *fp); //宏
  • int putc(int c, FILE *fp); //宏

3 读写一行的I/O流

  • char *fgets(char *buf, int n, FILE *fp); //成功则返回buf,已到文件尾或出错则返回EOF;读取一行或者n-1个字符,然后自动加上'\0';
  • int fputs(const char *buf, FILE *fp); //成功则返回非负值,出错则返回EOF;
  • char *gets(char *buf); //一直读取直到遇到'\n'或者EOF停止,最后自动把'\n'替换为'\0'
  • int puts(const char *buf);

4 直接I/O流:返回读写的对象数nobj

  • size_t fread(void *buf, size_t size, size_t nobj, FILE *fp);
  • size_t fwrite(void *buf, size_t size, size_t nobj, FILE *fp);

5 流的定位

  • long ftell(FILE *fp); //成功则返回当前文件位置指示,出错则返回-1
  • int fseek(FILE *fp, long offset, int whence); //成功则返回0,出错则返回-1,whence:SEEK_SET、SEEK_CUR、SEEK_END
  • void rewind(FILE *fp); //等同于fseek(fp, 0, SEEK_SET);

6 格式化I/O流

(1)格式化输出:成功则返回输出的字符数,出错则返回负值;

  • int printf(const char *format, ......); //终端stdout 
  • int fprintf(FILE *fp, const char *format, ......); //文件流
  • int dprintf(int fd, const char *format, ......); //文件描述符
  • int sprintf(char *buf, const char *format, ......); //数组buf
  • int snprintf(char *buf, size_t n, const char *format, ......); //带长度n的数组buf 

(2)变种的格式化输出:把可变参数......替换为arg,这是上面函数的具体实现

  • int vprintf(const char *format, va_list arg); //终端stdout 
  • int vfprintf(FILE *fp, const char *format, va_list arg); //文件流
  • int vdprintf(int fd, const char *format, va_list arg); //文件描述符
  • int vsprintf(char *buf, const char *format, va_list arg); //数组buf
  • int vsnprintf(char *buf, size_t n, const char *format, va_list arg); //带长度n的数组buf 

(3)格式化输入:成功则返回输入是项数,已到文件尾或出错则返回EOF;

  • int scanf(const char *format, ......); //终端stdin
  • int fscanf(FILE *fp, const char *format, ......); //文件流
  • int sscanf(char *buf, const char *format, ......); //数组buf

(4)变种的格式化输入:把可变参数......替换为arg,这是上面函数的具体实现

  • int vscanf(const char *format, va_list arg); //终端stdin
  • int vfscanf(FILE *fp, const char *format, va_list arg); //文件流
  • int vsscanf(char *buf, const char *format, va_list arg); //数组buf

printf系列输出格式总结:

  • %c:字符
  • %s:字符串
  • %f:浮点数(float或double)
  • %d:有符号的十进制整数(%ld:长整型)
  • %u:无符号的十进制整数(%lu:长整型,%zu:size_t类型
  • %l:长整型;%h:短整型
  • %o:八进制整数
  • %x:十六进制整数
  • %p:指针 
  • -:左对齐,默认是右对齐
  • 0:空位补0,默认是补空格
  • m.n:m表示域宽即输出项的宽度,n表示精度即小数位数(默认是6位)

比如int a=1234,%6d表示a=  1234,%06d表示a=001234,%-6d表示a=1234  ,%2d表示a=1234;

posted @ 2019-08-19 21:20  博1990  阅读(671)  评论(0编辑  收藏  举报