一、在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;