目录
什么是文件
文件名
文件名是一个唯一的文件标识,一般包含三个部分:文件路径+文件名主干+后缀名
例如我们的C语言源文件main.c
文件的打开和关闭
文件指针
每一个被使用的文件都在内存中开辟一个相对应的文件信息去,用于存放文件的相关信息。这些信息都是保存在一个结构体变量中的,在系统中有声明为FILE
创建一个FILE*指针变量可以指向某个文件的文件信息区,通过该文件信息区就可以访问到改文件,也就是说**通过文件指针变量能够找到与它关联的文件
FILE* pf;//创建文件指针变量
打开和关闭文件
在库函数中fopen函数是负责打开文件,fclose是负责关闭文件的
在进行文件操作前我们都应该先打开文件,操作完文件之后一定要记得关闭文件
fopen
FILE * fopen ( const char * filename, const char * mode );
第一个参数为文件指针,第二个是打开文件的方式
打开文件会有很多种方式,例如只读,只写,追加
#include <stdio.h>
int main ()
{
FILE * pFile;
//打开文件
pFile = fopen("test.txt","w");
}
fclose
打开文件操作完后要关闭文件
fclose(pFile);
pFile=NULL;
文件的顺序读写
fgetc
适用于所有输入流的字符输入函数
int main()
{
//读一个字符
//读一次读第一个字符,以此类推
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
/*int ch = fgetc(pf);
printf("%c\n", ch);
ch = fgetc(pf);
printf("%c\n", ch);*/
//int ch = 0;
while ((ch = fgetc(pf)) != EOF)
printf("%c\n", ch);
fclose(pf);
pf = NULL;
return 0;
}
fputc
适用于所有输出流的字符输出函数
int main()
{
//写一行数据
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
fputs("hjb", pf);
fclose(pf);
pf = NULL;
return 0;
}
fgets
适用于所有输入流的文本行输入函数
int main()
{
//读一行数据
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
char arr[20] = { 0 };
//'\0'也包括读的个数中
fgets(arr, 4, pf);
printf("%s\n", arr);
fclose(pf);
pf = NULL;
return 0;
}
fputs
适用于所有输出流的文本行输出函数
fprintf
适用于所有输出流的格式化输出函数
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
fprintf(pf, "%s %d %f", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
fscanf
适用于所有输入流的格式化输入函数
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
printf("%s %d %f\n", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
fread
适用于文件的二进制输入
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
//读二进制文件
struct S s = { 0 };
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
fread(&s, sizeof(s), 1, pf);
printf("%s %d %0.2f", s.arr, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
fwrite
适用于文件的二进制输出
struct S
{
char arr[10];
int age;
float score;
};
int main()
{
//二进制写到文件
struct S s = { "zhangsan",25,50.5f };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
//如果失败,打印错误信息
perror("fopen:");
return 1;
}
fwrite(&s, sizeof(s), 1, pf);
fclose(pf);
pf = NULL;
return 0;
}
文件读取结束的判定
feof
在文件读取过程中,一定不嗯呢该使用feof函数的返回值直接用来判断文件是否结束
而是用于当文件读取结束时,判断文件结束的原因是读取失败还是遇到文件尾结束
- 文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL . - 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
文件缓冲区
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓
冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。