IO
标准IO
文件IO/目录操作/库
文件的概念:
文件:一组相关数据的有序集合。
linux里一切兼文件。
文件名:这一组集合的名称。
文件的分类
按文件的操作方式来分:
标准文件:stdin, stdout, stderr; --> scanf/printf/perror
一般文件:.c, .h, .o, 设备文件
按文件的内容分类 :
源文件
目标文件
数据文件
按数据的组织形式分:
ASCII文件,也叫文本文件
二进制文件
按文件存放的数据的作用不同分:
-,d,l,c,b,p,s
文件操作:
1. 步骤:******
[创建]打开文件
操作文件[读/写/跳转…]
关闭文件
2. 缓冲区
一段特殊的内存,目的是为了减少程序和硬件的交互。提高效率。
行缓冲 :stdin, stdout
全缓冲 : 普通文件
不缓冲 : stderr
清空缓冲区:
回车换行
进程正常结束exit(0);
int fflush( FILE * stream );
缓冲区满
3. FILE * 文件流
一个FILE的指针指向一个被打开的文件。
文件描述符
一个整型值,代表一个被打开的文件。
4. 函数
打开文件
FILE *fopen (const char *path, const char *mode);
参数:
path : 文件名
mode : 打开方式:r只读,r+读写 --> 文件必须存在
w只写,w+读写 --> 文件不存在会新建,文件存在会清空
a追加,a+读+追加 --> 文件不存在会新建
操作文件
一个字符一个字符
int fgetc( FILE * stream );
int fputc( int c, FILE * stream );
一行一行操作***
char *fgets(char *s, int size, FILE *stream);
从stream所指的文件中读size-1字符到s所指的内存中。
如果在size-1之前遇到\n,会把\n读进去,马上结束,后面不再读取。
int fputs(const char *s, FILE *stream);
一块一块操作 --- 二进制文件
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr: 从stream所指文件读数据到ptr所指内存中
size : 每一块的大小
nmemb: 一共多少块
stream :打开的文件流
返回值:成功时,返回读到的块数;失败时,返回-1。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
ptr: 把ptr所指内存中数据写入stream所指文件中
size : 每一块的大小
nmemb : 一共有多少块
stream :打开的文件流
返回值:成功时,返回写入的块数;失败时,返回-1。
格式化操作
int scanf( const char * format, ...);
int fscanf(FILE *stream, const char *format, ...);
//int sscanf(const char *str, const char *format, ...);
int printf( const char * format, ... );
int fprintf(FILE *stream, const char *format, ...);
//int sprintf(char *str, const char *format, ...);
测试文件是否结束
int feof( FILE * stream );
文件结束时,返回非0值, 文件没有结束,返回0
关闭文件
int fclose(FILE *fp);
跳转光标
void rewind(FILE *stream); //跳转光标到文件开头
int fseek(FILE *stream, long offset, int whence);
参数:
stream : 打开的文件流
offset : 偏移量
whence : 相对位移,SEEK_SET(文件开头), SEEK_CUR(当前位置), SEEK_END(文件末尾)
返回值:成功时,0;失败时,返回-1。
例:向后跳转到距离当前位置10个字节:fseek(fp, 10, SEEK_CUR);
例:向前跳转到距离当前位置12个字节:fseek(fp, -12, SEEK_CUR);
例:跳到文件末尾:fseek(fp, 0, SEEK_END);
例:跳到文件开头:fseek(fp, 0, SEEK_SET);
long ftell(FILE *stream);
返回值:成功时,光标的偏移量;失败时,返回-1。