一、Linux C编程笔记——标准IO
标准 I/O 虽然是对文件 I/O 进行了封装但事实上并不仅仅只是如此标准 I/O 会处理很多细节譬如分配 stdio 缓冲区、以优化的块长度执行 I/O 等。标准 I/O 库函数是构建于文件 I/Oopen()、read()、write()、lseek()、close()等这些系统调用之上的。1.fopen(打开文件)FILE *fopen(const char *path, const char *mode); path参数 path 指向文件路径可以是绝对路径、也可以是相对路径。 mode参数 mode 指定了对该文件的读写权限是一个字符串稍后介绍。 返回值调用成功返回一个指向 FILE 类型对象的指针FILE *失败则返回 NULL并设置 errno mode: r 以只读方式打开文件。 O_RDONLY r 以可读、可写方式打开文件。 O_RDWR w 以只写方式打开文件,文件存在截断为0,不存在创建该文件 O_WRONLY | O_CREAT | O_TRUNC w 以可读、可写方式打开文件,文件存在截断为0,不存在创建该文件 O_RDWR | O_CREAT | O_TRUNC a 只写方式打开文件,打开以进行追加内容,不存在创建该文件 O_WRONLY | O_CREAT | O_APPEND a 以可读、可写方式打开文件以追加方式写入,不存在创建该文件 O_RDWR | O_CREAT | O_APPEND fopen()函数新建文件时无法手动指定文件的权限但却有一个默认值 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666) 使用只读方式打开文件 fopen(path, r); 使用可读、可写方式打开文件 fopen(path, r); 使用只写方式打开文件并将文件长度截断为 0如果文件不存在则创建该文件 fopen(path, w)2.fclose()关闭文件int fclose(FILE *stream); 参数stream为FILE类型指针调用成功返回0失败将返回EOF也就是-1并且会设置 errno3.fread(读文件)size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); ptr将读取到的数据存放在参数 ptr 指向的缓冲区中 size从文件读取 nmemb 个数据项每一个数据项的大小为 size 个字节所以总共读取的数据大 小为 nmemb * size 个字节。 nmemb参数 nmemb 指定了读取数据项的个数。 streamFILE 指针。 返回值调用成功时返回读取到的数据项的数目数据项数目并不等于实际读取的字节数除非参数 size 等于 1 fread()不能区分文件结尾和错误此时可以使用 ferror()或 feof() 函数来判断4.fwrite()写文件size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); ptr将参数 ptr 指向的缓冲区中的数据写入到文件中。 size参数 size 指定了每个数据项的字节大小与 fread()函数的 size 参数意义相同。 nmemb参数 nmemb 指定了写入的数据项个数与 fread()函数的 nmemb 参数意义相同。 streamFILE 指针。 返回值调用成功时返回写入的数据项的数目数据项数目并不等于实际写入的字节数除非参数 size 等于 1如果发生错误则 fwrite()返回的值将小于参数 nmemb或者等于 0。5.fseek 定位int fseek(FILE *stream, long offset, int whence); streamFILE 指针。 offset与 lseek()函数的 offset 参数意义相同。 whence与 lseek()函数的 whence 参数意义相同。 返回值成功返回 0发生错误将返回-1并且会设置 errno 以指示错误原因与 lseek()函数的返回值 意义不同6.ftell()函数long ftell(FILE *stream); 参数 stream指向对应的文件成功返回当前位置偏移量失败将返回-1并设置errno。7.feof()函数int feof(FILE *stream); 测试参数 stream 所指文件的 end-of-file 标志如果 end-of-file 标志被设置了则调用feof()函数将返回一个非零值如果 end-of-file 标志没有被设置则返回 0。8.ferror()函数int ferror(FILE *stream); 用于测试参数 stream 所指文件的错误标志如果错误标志被设置了9.clearerr()函数void clearerr(FILE *stream); 用于清除 end-of-file 标志和错误标志当调用 feof()或 ferror()校验这些标志后通常需要清除这些标志10.格式化输出 printf()、fprintf()、dprintf()、sprintf()、snprintf()int printf(const char *format, ...); printf(%d\n, 5); int fprintf(FILE *stream, const char *format, ...); 可将格式化数据写入到由 FILE 指针指定的文件中 fprintf(stderr, %d\n, 5); int dprintf(int fd, const char *format, ...); 可将格式化数据写入到由文件描述符 fd 指定的文件中 dprintf(STDERR_FILENO, %d\n, 5); int sprintf(char *buf, const char *format, ...); 将格式化数据存储在由参数 buf 所指定的缓冲区中 char buf[100]; sprintf(buf, Hello World!\n); int snprintf(char *buf, size_t size, const char *format, ...);11.格式化输入scanf()、fscanf()、sscanf()int scanf(const char *format, ...); scanf(%d %d %d, a, b, c); int fscanf(FILE *stream, const char *format, ...); fscanf(stdin, %d %d %d, a, b, c); int sscanf(const char *str, const char *format, ...); sscanf(str, %d %s, a, buf);12.文件描述符与 FILE 指针互转int fileno(FILE *stream); 根据传入的 FILE 指针得到整数文件描述符通过返回值得到文件描述符 FILE *fdopen(int fd, const char *mode); 给定一个文件描述符得到该文件对应的 FILE 指针