文件IO编程:
优点:适用于存取大量数据的场景,节省内存
缺点:速度降低
文件IO操作:打开->操作->关闭
1.fopen函数:打开文件
函数原型:FILE *fopen(const char *filename, const char *mode);
打开成功会返回一个FILE类型指针,否则返回NULL
(1)参数1:
文件名(如果文件在当前目录下的话直接写文件名就行,否则要加上文件的路径)。
(2)参数2:
文件打开方式:由"r,w,a,t,b,+"六个字符拼成,各字符的含义是:
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
+: 读和写
2.fwrite函数:对文件进行写操作
函数原型:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)
把ptr所指向的数据写入文件中,成功将返回实际写入的数据数目,失败返回-1 。
(1)参数1:
ptr:要写的数据首地址
(2)参数2:
size:每个数据的大小(字节)
(3)参数3:
count:数据的数目
(4)参数4:
stream:已打开的文件指针
3.fread函数:对文件进行读操作
函数原型:size_t fread(void *buffer,size_t size,size_t count,FILE *stream);
从文件读取size * count空间大小的数据到buffer
4.fclose函数:关闭文件
函数原型:int fclose(FILE *stream)
关闭文件指针stream指向的文件。
简单例子:将数据存入磁盘文件test.txt中,再从文件读取、输出数据。
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp; //文件指针用于操作文件
char s[]="你好abc!"; //9个字节大小的字符串(2+2+1+1+1+1+1)
int a=1;
if ( ( fp=fopen("test.txt", "a+") ) == NULL) //以a+模式打开文件
{
puts("open error!");
getchar();
exit(0);
}
fwrite(s, sizeof(char), sizeof(s)/sizeof(char), fp); //将字符串s写入文件
fwrite(&a, sizeof(int), 1, fp); //将a的值写入文件
fclose(fp);
char b[9]={
0}; //这里b数组空间大小要和s相同,不然会读错c
int c=0;
if ( ( fp=fopen("test.txt", "r+") ) == NULL) //以r+模式打开文件
{
puts("open error!");
getchar();
exit(0);
}
fread(b, sizeof(char), sizeof(b)/sizeof(char), fp); //从文件读s字符串到b
fread(&c, sizeof(int), 1, fp); //从文件读a的值到c
fclose(fp);
printf("%s\n",b); //输出从文件读到的数据
printf("%d\n",c);
return 0;
}
程序结果:
上面实现了最基本的输入输出,如果需要更复杂的操作,还有其他的文件IO操作函数:
fseek函数:文件定位
rewind函数:清楚错误标记,将文件定位在开头
fflush函数:更新文件流缓存区
等等
注:
①注意文件的打开方式,不合适的打开方式可能会失败;比如不存在的文件用r+方式打开就不行了。
②在电脑上显示非字符串会出现乱码,因为编码的问题,txt只能显示字符串文本信息。
③连续、多次从文件读取数据时要考虑好文件指针定位和读取空间越界的问题。