1.文件的打开与关闭
(1)文件指针FILE(本质是一个结构体)
//<stdio.h>中的定义
typedef struct _iobuf
{
void* _Placeholder;
} FILE;
(2)打开关闭
FILE* fopen(const char* filename, const char* mode);
int main()
{
FILE* pf = fopen("test.txt", "w"); //用FILE*的结构体指针变量接收
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
fclose(pf);
pf = NULL; //关闭文件后制空pf指针
return 0;
}
2.文件相关函数
(1)写入文件
int fputc(int ascii, FILE* stream); //写入字符
int fputs(const char* string, FILE* stream); //写入一行
int fprintf(FILE* stream, const char* format[, argument]...); //往文件里格式化写入
//写文件时,若文档里有内容,则会清空后写入
size_t fwrite(const void* ptr, size_t size, size_t count, FILE* stream); //二进制写入
//要写的数据来源的地址,一个元素多大,元素个数,目标地址,返回成功写入的数据个数
(2)从文件中读取
int fgetc(FILE* stream); //读字符
char* fgets(char* string, int n, FILE* stream);
//读一行,n为最大读取个数,但是实际上会读取少一个,因为最后一个要补'\0'
int fscanf(FILE* stream, const char* format[, argument]...); //从文件里格式化读取
size_t fread(void* ptr, size_t size, size_t count, FILE* stream); //二进制读取
//返回成功读取的数据个数
(3)例子
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
perror("fopen"); //也能打印错误信息,而且会在错误信息之前加上“fopen:”
return 1;
}
fputc('a', pf);
fputc(97, pf);
//读文件
int ch = 0;
while ((ch = fgetc(pf)) != EOF)
{
printf("%c\n", ch);
}
char arr[20];
fgets(arr, 5, pf);
printf("%s\n", arr); //读完了之后存到arr里去了,并不是直接读取到屏幕上
int a;
char b;
fprintf(pf,"%d %c", a, b); //写入
fscanf(pf, "%d %c", &a, &b); //读出
fclose(pf);
pf = NULL;
return 0;
}
3.流
任何一个c程序,只要运行起来,就会默认打开3个流
FILE* stdin - 标准输入流(键盘)
FILE* stdout - 标准输出流(屏幕)
FILE* stderr - 标准错误流(屏幕)
fprintf(pf, "%d %c", a, b); //往文件里格式化写入
fprintf(stdout, "%d %c", a, b); //往屏幕里格式化写入,就写道屏幕上了(输出了)
4.sprintf()和sscanf
int sprintf(char* str, const char* format[, argument] ...);
//把一个格式化的数据写到字符串中,本质是把一个格式化的数据转化成字符串
int sscanf(char* str, const char* format[, argument] ...);
//从字符串中提取格式化数据
struct s
{
char arr[10];
int age;
float score;
};
int main()
{
struct s s = { "zhangsan",20,55.5f };
char buf[100];
sprintf(buf, "%s %d %f", s.arr, s.age, s.score);
printf("%s\n", buf);
//把一些格式化的数据写到字符串buf中,变成字符串了“zhangsan 20 55.500000”
struct s su = { 0 };
sscanf(buf,"%s %d %f", su.arr,&(su.age), &(su.score));
//从字符串buf中获取一个格式化的数据到su中
printf("%s %d %f", su.arr,su.age,su.score);
return 0;
}
5.文件随机函数
(1)fseek()——控制文件指针
int fseek(FILE* stream, long int offset, int origin);
//流,偏移量,起始地址(SEEK_SET,SEEK_CUR,SEEK_END)
(2)ftell()——寻找文件指针
long ftell(FILE* stream);
//返回指针相对起始位置的偏移量
(3)rewind()——文件指针返回起始位置
void rewind(FILE* stream);
int main()
{
FILE* pf = fopen("test.txt", "r");
fseek(pf,2, SEEK_SET); //定位文件指针
int ch = fgetc(pf); //读取并存放
printf("%c\n", ch); //打印ch
fseek(pf, 2, SEEK_CUR);
fseek(pf, -1, SEEK_END);
return 0;
}