1、文件操作
1.1、文件概念
文件:实现数据存储的载体
1.2、文件的分类
按照数据的组织形式分类:
1.字符文件/文本文件
2.二进制文件
按照用途分类:
1.系统文件
2.库文件--标准库文件/非标准库文件(第三方库)
3.用户文件
Linux下的文件分类:
-: 普通文件
d: 目录文件/文件夹
s: 套接字文件
p: 管道文件
l(小写的 L): 链接文件
c: 字符设备文件
b: 块设备文件
1.3、文件操作相关的函数
函数:man1 一般是指令
man2 一般是系统相关函数
man3一般是C语言标准库函数
文件操作相关流程:
1.打开文件--仅仅得到一个文件描述符
2.写/读--用函数操作文件描述符
3.关闭文件
1.3.1 打开文件
函数的头文件为:#include<stdio.h>
函数名:fopen
函数原型:FILE *fopen(const char *pathname, const char *mode);
形参:pathname:路径下的文件名
mode:打开文件的模式
“r”: 只读的方式打开, 光标在文件开头, 文件不存在, 打开失败!
“r+”: 读写的方式打开, 光标在文件开头, 文件不存在, 打开失败!
“w”: 只写的方式打开, 光标在文件开头, 文件不存在, 创建并打开, 文件存在, 清空
写!
“w+”: 读写的方式打开, 光标在文件开头, 文件不存在, 创建并打开, 文件存在, 清
空写!
“a”: 追加写, 光标在文件末尾, 文件如果不存在, 创建并打开;
“a+”: 可读可写, 根据你第一次操作该文件来确定光标位置, 第一次如果是读,光标默认在文件开头,第一次如果是写,光标在文件末尾;
返回值:
成功返回,FILE*;类型的文件描述符
失败:NULL;
#include<stdio.h>
int main()
{FILE*fp=fopen("./1.txt","r+");if(fp==NULL){printf("文件打开失败");return ;}return;
}
如果1.txt是存在的:打开成功,后续fp就代表1.txt这个文件
如果1.txt是不存在的:打开失败!
插入:perror--打印失败信息
头文件:#include<stdio.h>
函数原型:void perror(const char *s);
形参:s--提供一个字符串即可
功能:打印距离它最近的函数执行失败的原因;注意:这个离它最近的函数指的是从上到下的近。
1.3.2 关闭函数
头文件:#include<stdio.h>
函数原型:int fclose(FILE *stream);
形参:stream:用fopen打开文件得到的文件描述符
返回值:
成功返回:0
失败返回:-1
1.3.3 读和写函数
1单字符的读和写
单字符的写:fputc
头文件:#include<stdio.h>
函数原型:int fputc(int c, FILE *stream);
形参:c--传入char类型的单字符
将字符c写到文件指针所指向的文件的当前写指针的位置
stream--文件描述符
返回值:
成功:返回写入的单字符
失败:返回-1
单字符的读:fgetc
头文件:#include<stdio.h>
函数原型:int fgetc(FILE *stream);
形参: stream-文件描述符
返回值:
成功: 读取到的单字符, 用 char 类型来承接;
失败/读到文件末尾: -1
插入: rewind: 光标偏移至文件开头
void rewind(FILE *stream);
stream: fopen 的返回值
功能: 光标偏移至文件开头
2 字符串的读和写
字符串的写:fputs
函数原型:int fputs(const char *s, FILE *stream);
形参: s: 要写入文件中的字符串的首地址
stream: fopen 的返回值;
返回值: 成功返回一个非负数( 通常为 1) , 失败返回-1
字符串的读: fgets
函数原型:char *fgets(char *s, int size, FILE *stream);
形参: s: 读取到的内容存放的位置的首地址;
size: 你要读多大! !
stream: fopen 的返回值;
返回值: 成功: char * -- 依旧是 s
失败: NULL
C语言默认打开的三个文件
标准输入文件描述符--stdin--对应键盘
标准输出文件描述符--stdout--对应屏幕
标准出错文件描述符--stderr--对应屏幕
3格式化的读和写
格式化写入:fprintf
fprintf(fopen(返回值),“原样输出+格式控制符”,输出列表)
注意:fprintf(stdout,“hello\n”); == printf(“hello\n”);
格式化读取:fscanf
要求:fscanf从文件中读,要求格式和fprintf()写入时一模一样;
这两个函数必须是配合使用的
举例说明:
int a=10,b=20,c=30;fprintf(fp,”%d-%d-%d\n”,a,b,c);int x,y,z;fscanf(fp,”%d-%d-%d\n”,&x,&y,&z);
4 块读 块写(二进制,要配合使用)
块写:fwrite
函数原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream);
形参:ptr:要写入的内容的首地址size:一次写多大
nmemb:写几次
stream:fopen的返回值;
返回值:真正写入的次数
块读:fread
函数原型:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
形参:ptr:读取的内容存放的位置的首地址
size:一次读多大
nmemb:读几次
stream:fopen的返回值;
返回值:成功:真正读取的次数,
遇到文件末尾,返回0
光标偏移函数:fseek
头文件:#include<stdio.h>
函数原型:int fseek(FILE *stream, long offset,int whence);
形参:stream:文件描述符
offset:偏移量+往文件末尾方向-往文件开头方向
whence:相对位置
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
fseek(fp,0,SEEK_SET); == rewind(fp); 以文件开头为起始位置, 偏移 0 字节
ftell函数:计算光标当前位置举例文件开头的偏移量函数原型:long ftell(FILE *stream);
形参:stream:文件描述符
返回值:光标当前位置举例文件开头的偏移量
程序中计算文件的大小
fessk(fp,0,SEEK_END);//光标达到文件末尾
long num=ftell(fp);//num就是文件大小