如果把C语言编写的程序在内存中运行的结果显示在控制台上,当程序执行结束时,内存中的数据会被清空,无法永久存储。所以C语言中定义了文件操作的函数,用来操作内存外部可以永久存储数据的介质(磁盘、闪盘等)。
对于操作不同长度的数据类型,C语言中定义了不同的文件操作函数。
1 读写一个字符的函数fputc()和fgetc();
fputc()格式:fputc(字符,文件指针);
fgetc()格式:fgetc(字符,文件指针);
通过fputc()或者fgetc()获取一个字符后,文件指针会自动移动到下一个写入或读取字符的位置。文件中数据结束的标志是宏定义的EOF,因此当从文件中读取字符时,可以通过判断读取的字符是否是EOF来作为文件是否读取结束的标志。
2 读写一个字符串函数fputs()和fgets();
fputs()格式:fputs(字符串,文件指针);
fgets()格式:fgets(存储首地址,读取长度,文件指针);
比如:
<1> FILE *fp = fopen("text.txt","w");
fputs("I LOVE CHINA!",fp);//表示把字符串“I LOVE CHINA!”写入的文件text.txt中,其返回的是字符串长度,不包含字符‘\0’,这次返回的数字为13;
<2> char name[20];
int count = 10;
fgets(name,count,fp);//从文件text.txt中读取长度为count的数据到字符数组name当中,其中count表示包含字符‘\0’的总长度,其读取的字符为count-1(9)个;
3 格式化读写函数fscanf()和fprintf();
fscanf()格式:fscanf(文件指针,格式控制字符串,变量列表);
fprintf()格式:fprintf(文件指针,格式控制字符串,变量列表);
通过格式化读写函数fscanf()和fprintf()可以把已有的数据按照自定义的方式存储到文件当中,如1#3,2#4等,这样可以让数据更具有可读性;
4 数据块的读写函数fwrite()和fread();
fwrite()格式:fwrite(要写入的数据首地址,数据块大小,数据块个数,文件指针);
fread()格式:fread(要读入的数据首地址,数据块大小,数据块个数,文件指针);
通过数据块读写函数fwrite()和fread()可以方便的存储和读取结构体变量;
关于文件操作函数的应用实例如下:
#include <stdio.h>
//记录从键盘录入的字符串
int main(int argc, const char * argv[]) {
//定义变量
int ch;
//提示用户输入
printf("请输入字符串:\n");
//打开文件
FILE *fp = fopen("test.txt", "w+");
ch = getchar();
int count = 0;
while (ch != '\n') {
//写入文件
fputc(ch, fp);
ch = getchar();
count++;
}
printf("共输入%d个字符!\n",count);
//读入文件
rewind(fp);
ch = fgetc(fp);
count = 0;
while (ch != EOF) {
printf("%c",ch);
ch = fgetc(fp);
count++;
}
printf("共输出%d个字符\n",count);
//关闭文件
int f = fclose(fp);
if (f == 0) {
printf("文件关闭成功\n");
};
return 0;
}
#include <stdio.h>
//字符串的写入和读出
int main(int argc, const char * argv[]) {
//打开文件
FILE *fp = fopen("test1.txt", "r+");
int count = 0;
if (fp != NULL) {
//写入字符串
count = fputs("I LOVE CHINA!", fp);
printf("写入%d个字符\n",count);
//读取字符串
char ch[100];
rewind(fp);//文件指针返回文件首
fgets(ch, count, fp);
printf("读取字符串为:%s\n",ch);
}
//关闭文件
fclose(fp);
return 0;
}
#include <stdio.h>
//格式化输入函数
int main(int argc, const char * argv[]) {
//打开文件
FILE *fp = fopen("fprintf.txt", "w+");
//格式化输入文件
if (fp != NULL) {
for (int i = 0; i < 10; i++) {
fprintf(fp, "%d#%d\n",i,i+2);
}
printf("写入成功\n");
rewind(fp);
//格式化读取数据到数组
int num[20];
int j = 0;
for (int i = 0; i < 10; i++) {
fscanf(fp, "%d#%d",&num[j++],&num[j++]);
}
for (int j = 0; j < 20; j++) {
printf("%d\t", num[j]);
}
printf("\n");
}
//关闭文件
fclose(fp);
return 0;
}
#include <stdio.h>
//从结构体信息的读取fread和fwrite
int main(int argc, const char * argv[]) {
// 定义结构体及结构体数组
struct student{
char name[20];
int age;
float score;
} stu[2] = {{"jiaxu",25,80.00f},{"liuye",25,75.3f}};
//初始化结构体数组
//打开文件
FILE *fp = fopen("fstruct.data", "wb+");
//循环写入结构体元素
if (fp != NULL) {
for (int i = 0; i < 2; i++) {
fwrite(&stu[i], sizeof(struct student), 1, fp);
}
printf("写入成功\n");
//定义结构体数组以接收读取的结构体成员
struct student stu2[2];
rewind(fp);
for (int i = 0; i <2; i++) {
fread(&stu2[i], sizeof(struct student), 1, fp);
}
printf("读取成功!\n");
//打印新定义的结构体数组元素
for (int i = 0; i < 2; i++) {
printf("name:%s age:%d score:%.2f\n",stu2[i].name,stu2[i].age,stu2[i].score);
}
}
//关闭文件
fclose(fp);
return 0;
}