C语言标准IO
一、FILE *fopen(const char *path, const char *mode)
打开文件
- 成功,返回值FILE*
- 失败返回NULL
perrer("fopen()");
- 返回失败如果exit,要调用fcloes()关闭,防止内存泄露,
fopen的实现在堆中申请内存,mallco 了一块内存 存放FILE* 返回 FILE* - fopen()最多能成功打开的文件个数,一般情况1024个,前3个是stdin,stdout,stderr
- 可以用ulimit命令来限制最大打开个数,比如
ulimit -n 512
二、int fgetc(FILE* stream)
- 从流中读取一个字符,读取后光标后移一个位置
- 返回值是int 成功返回字母转成的int,到结尾或读取失败返回EOF
- 相反的就是fputc(int c , FILE* stream)
- putchar(int c)和putc(int c,FILE*stream) 和fputc类似
- 不要用gets(),因为它不检查缓冲区溢出,可以用fgets()代替
- puts()和fputs()类似
- size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)
-
- nmemb 就是一次最少读对象的个数,
fread(buff,1,10,fp)
如果fp里只有5个char,返回5,fread(buff,10,1,fp)
这个就是返回0
- nmemb 就是一次最少读对象的个数,
- size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
三、int printf(const char *format, …)
-
int fprintf(FILE *stream, const char *format, …)
-
printf是行缓冲模式,如果不加\n,就要等下次出现\n,或者程序结束时候才输出,也可以强制刷新缓冲区fflush(stdout)
-
int dprintf(int fd, const char *format, …)
-
int sprintf(char *str, const char *format, …)
-
int snprintf(char *str, size_t size, const char *format, …)
-
sacnf()
四、int fseek(FILE *stream, long offset, int whence)
- 返回值 成功0,失败-1
- whence起始位置,offset是偏移量
fseek(fp,-10,SEEK_CUR)
表示当前位置往前10个字符 - 在文本模式中,只有以下调用能保证其相应的行为。
函数调用 | 效果 |
---|---|
fseek(file, 0L, SEEK_SET) | 定位至文件开始处 |
fseek(file, 0L, SEEK_CUR) | 保持当前位置不动 |
fseek(file, 0L, SEEK_END) | 定位至文件结尾 |
fseek(file,ftell-pos, SEEK_SET) | 到距文件开始处ftell-pos的位置,ftell-pos是ftell()的返回值 |
- long ftell(FILE *stream)
- long offset 限制的long最大为2G
- int fseeko(FILE *stream, off_t offset, int whence) 这个就不限制了
- off_t ftello(FILE *stream)
- #define _FILE_OFFSET_BITS 64 用这个定义可以把off_t定义为64位
- 可以在makefile里写上面的宏 CFLAGS+=-D_FILE_OFFSET_BITS=64
五、ssize_t getline(char **lineptr, size_t *n, FILE *stream)
- ssize_t 是有符号整形,相当于int或者long int
- 返回值 成功 返回读取字符数量 失败 -1
- 写一个读取文件行数的例子
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** argv)
{
if(argc<2)
{
fprintf(stderr,"%s 读取文件名出错\n",argv[0]);
fprintf(stderr,"格式:%s <文件名>\n",argv[0]);
exit(EXIT_SUCCESS);
}
//打开文件
FILE* fp = fopen(argv[1],"r");
if(fp==NULL)
{
perror("fopen()");
exit(EXIT_FAILURE);
}
//读取行
char* buff=NULL;
size_t n=0,count=0;
while(getline(&buff,&n,fp)!=-1)
count++;
printf("%s有%d行内容\n",argv[1],count);
free(buff);
fclose(fp);
return 0;
}
六、临时文件
- FILE* tempfile(void)
-
- 该函数创建临时文件,以二进制读写方式打开,创建的文件存储在默认文件目录,结束后会删除,返回值,成功返回指向该文件的指针,失败返回NULL
- 这个临时文件可以fclose关闭,或者return 0,或者exit(0)结束,属于可控内存泄漏
不像fopen,只打开不关闭的话打开文件数量是有上限的