重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
为什么使用文件?
我前面学习结构体时,写了通讯录的程序,当通讯录运行起来的时候,可以给通讯录中增加、删除数据,此时数据是存放在内存中,当程序退出的时候,通讯录中的数据自然就不存在了,等下次运行通讯录程序的时候,数据又得重新录入,如果使用这样的通讯录就很难受。
我们在想既然是通讯录就应该把信息记录下来,只有我们自己选择删除数据的时候,数据才不复存在。这就涉及到了数据持久化的问题,我们一般数据持久化的方法有,把数据存放在磁盘文件、存放到数据库等方式。
使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。
二.FILE简介FILE是一个结构体,在vs2013中FILE有如下定义:
图片来自cplusplus网站
filename 是要打开的文件名
mode 是对文件的操作
常见操作如下:
“r”(只读) 为了输入数据, 打开一个已经存在的文本文件
"w”(只写) 为了输出数据, 打开一 个文本文件
“a”(追加) 向文本文件尾港 添加数据
"rb”(只读) 为了输入数据 打开 个二进制文件
“wb”(只写) 为了输出数据, 打开 个二进制文件
“ab”(追加) 向一个二进制 文件尾添加数据
“r+”(读写) 为了读和写,打开一个文本文件
"w+"(读写) 为了读和写,建议一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写
“rb+”(读写) 为了读和写打开一个二进制文件
“wb+”(读写) 为了读和写新建一个新的二进制文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写
使用示范
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{ perror("fopen");
return 1;
}
注意"r","test.txt"必须用双引号
2.fclose关闭文件int main()
{//打开文件
FILE* pf = fopen("test.txt", "w");
if (NULL == pf)
{perror("fopen");
return 1;
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.顺序读写文件1)fputc
使用示范:
int main()
{//打开文件
FILE* pf = fopen("test.txt", "w");
if (NULL == pf)
{perror("fopen");
return 1;
}
//写文件
int i = 0;
for (i = 0; i< 26; i++)
{fputc('a'+i, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
注意返回类型是int
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{//打开文件
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{perror("fopen");
return 1;
}
//读文件
int i = 0;
for (i = 0; i< 26; i++)
{ int ch = fgetc(pf);
printf("%c ", ch);
}
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
一行一行的写入
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{//打开文件
FILE* pf = fopen("test.txt", "w");
if (NULL == pf)
{perror("fopen");
return 1;
}
//写文件-一行一行写
fputs("hello\n", pf);
fputs("worl\n", pf);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
一行一行的读文件
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{//打开文件
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{perror("fopen");
return 1;
}
//读文件-一行一行读
char arr[20] = "#########";
fgets(arr, 20, pf);//在文件pf中读取一行数据,最多读20个,存入arr中
printf("%s", arr);
fgets(arr, 20, pf);
printf("%s", arr);
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
格式化输入函数
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includestruct S
{char name[20];
int age;
float score;
};
int main()
{struct S s = {"zhangsan", 20, 95.5f };
//把s中的数据写到文件中
FILE*pf = fopen("test.txt", "w");
if (NULL == pf)
{perror("fopen");
return 1;
}
//写文件
fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);//将s.name, s.age, s.score写入文件pf
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
格式化输出函数
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includestruct S
{char name[20];
int age;
float score;
};
int main()
{struct S s = {0};
//把s中的数据写到文件中
FILE* pf = fopen("test.txt", "r");
if (NULL == pf)
{ perror("fopen");
return 1;
}
//读文件
fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));//将pf文件中内容的输入s.name, (s.age), (s.score)
printf("%s %d %f\n", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
以二进制形式写入文件
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includestruct S
{char name[20];
int age;
float score;
};
int main()
{struct S s = {"zhangsan", 20, 95.5f };
//把s中的数据写到文件中
FILE*pf = fopen("test.txt", "wb");
if (NULL == pf)
{perror("fopen");
return 1;
}
//二进制的写文件
fwrite(&s, sizeof(s), 1, pf);//将s中一个大小为sizeof(s)的内容写入文件pf
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
二进制形式读取文件
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includestruct S
{char name[20];
int age;
float score;
};
int main()
{struct S s = {0};
//把s中的数据写到文件中
FILE* pf = fopen("test.txt", "rb");
if (NULL == pf)
{perror("fopen");
return 1;
}
//二进制的读文件
fread(&s, sizeof(s), 1, pf);//从文件pf中读取一个大小为sizeof(s)的内容存入s
printf("%s %d %f\n", s.name, s.age, s.score);
fclose(pf);
pf = NULL;
return 0;
}
结果展示:
额外补充1:
使用示范:
#define _CRT_SECURE_NO_WARNINGS
#includeint main()
{int ch = fgetc(stdin);
fputc(ch, stdout);
return 0;
}
结果展示:
额外补充2:
额外补充3:
文件中不能包含这些字符:/:?"<>|,*
4.随机读写文件 1)fseek#includeint main ()
{FILE * pFile;
pFile = fopen ( "example.txt" , "wb" );
fputs ( "This is an apple." , pFile );
fseek ( pFile , 9 , SEEK_SET );//在文件pFile中从SEEK_SET开始读取第九个内容
fputs ( " sam" , pFile );
fclose ( pFile );
return 0;
}
2)ftell#includeint main ()
{FILE * pFile;
long size;
pFile = fopen ("myfile.txt","rb");
if (pFile==NULL) perror ("Error opening file");
else
{fseek (pFile, 0, SEEK_END); // non-portable
size=ftell (pFile);
fclose (pFile);
printf ("Size of myfile.txt: %ld bytes.\n",size);
}
return 0;
}
3)rewind#includeint main ()
{int n;
FILE * pFile;
char buffer [27];
pFile = fopen ("myfile.txt","w+");
for ( n='A' ; n<='Z' ; n++)
fputc ( n, pFile);
rewind (pFile);
fread (buffer,1,26,pFile);
fclose (pFile);
buffer[26]='\0';
puts (buffer);
return 0;
}
欢迎斧正,如有疑惑可私信或评论,会尽力解答,大家一起加油啊!
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧