文件的打开和关闭
文件的典型操作:打开文件 读文件 写文件 关闭文件
文件在读之前应该先打开文件,在使用结束之后应该关闭文件
ANSIC规定使用 fopen 函数来打开文件,用 fclose 来关闭文件
FILE *fopen( const char *filename, const char *mode );
//打开文件
//filename 文件路径
//mode 打开方式:读/写/(读写)
//每个函数都返回一个指向打开文件的指针,空指针值指示错误
int fclose( FILE *stream );
//关闭文件
//返回值: 成功返回 0 ;失败返回 EOF
文件的打开方式:
文件使用方式 | 含义 | 如果文件不存在 |
“r”(只读) | 为了输入数据,打开一个已经存在的文本文件 | 出错 |
“w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新文件 |
"a" (追加) | 向文本文件末尾添加数据 | 出错 |
“rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
“wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新文件 |
"ab" (追加) | 向二进制文件末尾添加数据 | 出错 |
“r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
“w+”(读写) | 为了读和写,建立一个新的文件 | 建立一个新文件 |
"a+" (读写) | 打开一个文件,在文件尾进行读写 | 建立一个新文件 |
Tip:文本文件:以ASCII字符的形式存储的文件就是文本文件
二进制文件:数据在内存中以二进制的形式存储,并且不加转换的输出到外存
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void test()
{
// . 当前目录
// .. 上一级目录
//fp 这类对象叫句柄
//FILE* fp = fopen("./test.txt", "r");
//按r只读方式打开
//
//FILE* fp = fopen("./test.txt", "w");
//按w只写方式打开,会先清空文件
//
FILE* fp = fopen("./test.txt", "a");//在文件末尾追加写
if (fp == NULL)
{
printf("fopen failed\n");
}
else {
printf("fopen ok!\n");
}
//对文件进行操作
//fread 读文件
// size_t fread( void* ptr ,size_t size,size_t count,FILE* stream);
//读取count个大小为size的元素
//返回值:返回真实读到数据的个数
char buf[1024] ="aaaaa";
fwrite(buf, 1, strlen(buf), fp);
/*size_t size= fread(buf, 1, 10, fp);
printf("%s\n", buf);
printf("%u\n", size);//10 */
//关闭文件
//如果频繁进行文件打开,又没有关闭
//叫做“文件描述符泄露”
fclose(fp);
}
int main()
{
test();
system("pause");
return 0;
}
文件的读写
文件的顺序读写
功能 | 函数名 | 适用于 |
字符输入函数 | fgetc | 所有输入流 |
字符输出函数 | fputc | 所有输出流 |
文本行输入函数 | fgets | 所有输入流 |
文本行输出函数 | fputs | 所有输出流 |
格式化输入函数 | fscanf | 所有输入流 |
格式化输出函数 | fprintf | 所有输出流 |
二进制输入 | fread | 文件 |
二进制输出 | fwrite | 文件 |
文件的随机读写
fseek: 根据文件指针的位置和偏移量来定位文件指针
int fseek(FILE* stream, long int offset,int orgin );
fteel:返回文件指着相对于起始位置的偏移量
long int ftell ( FILE* stream );
rewind:让文件指针的位置回到文件的起始位置
void rewind ( FILE* stream );
一组函数的对比
scanf / fscanf / sscanf
printf / fprintf / sprintf
void test1()
{
//stdin , FILE* ->标准输入
//stdout , FILE* ->标准输出
//键盘,显示器,一切皆文件的思想
FILE* fp = fopen("../test.txt", "w");
if (fp == NULL)
{
printf("test.txt fopen failed!\n");
return;
}
// fgets 和 fputs 的使用
//char buf[1024] = { 0 };
fgets 如果返回空指针,说明读到了EOF
//while (fgets(buf, sizeof(buf), stdin) != NULL)
//{
// fputs(buf, stdout);
// fputs(buf, fp);
//}
// fgetc 和 fputc 的使用
//int c;
//while ((c = fgetc(stdin)) != EOF) {
// fputc(c, stdout);
// fputc(c, fp);
//}
fflush(fp);
fclose(fp);
}
void test2()
{
typedef struct student {
char name[1024];
int score;
}student;
printf("hello\n");
fprintf(stdout, "hello\n");
//能够把一个数据进行格式化,然后放到一个字符串中
//这个操作就是把一个整数,转换成一个字符串
char buf[1024] = { 0 };
sprintf(buf, "%d", 100);
printf("%s\n", buf);
int num = 0;
sscanf(buf, "%d", &num);
//解析buf中的内容,以%d的形式放到num中
printf("%d\n", num);
//将一个结构体转换为字符串
student stu = { "zhangsan",100 };
char buf1[1024] = { 0 };
sprintf(buf1, "%s,%d", stu.name, stu.score);
printf("%s\n", buf1);
}
int main()
{
//test1();
test2();
system("pause");
return 0;
}