目录
一、写文件
文件分为文本文件和二进制文件,因为它们的存放形式不同,所以写文件的方法也不一样。
(1)写文本文件
在对文本文件进行写操作时,主要用到两个函数:fputc()函数和fputs()函数。
①fputc()函数
fputc()函数用于向文件中写入一个字符,其函数原型如下:
int fputc(char ch,FILE *fp);
【注释】
- ch 表示写入的内容
- fp表示待写入文件的指针
②fputs()函数
使用fputs()函数用于向文件中写入一个字符串(不自动写入字符串结束标记符'\0'),成功写入一个字符后,文件位置指针会自动后移,函数返回值为非负整数,否则返回EOF。函数原型如下:
int fputs( const char* str, FILE *fp);
【注释】
- str表示待写入的一行字符串;
- fp表示待写入的文件的指针;
(2)写二进制文件
对二进制文件进行写操作,主要使用:fwrite()函数
fwrite()函数用于以二进制形式向文件中写入数据,函数原型如下:
unsigned int fwrite( const void* str, unsigned int size, unsigned int count, FILE* file);
【注释】
- str表示待写入数据的指针;
- size表示待写入数据的字节数;
- count表示待写入数据的个数;
- file表示待写入的数据的文件指针。
二进制文件读写在内存和二进制文件之间传送二进制形式的数据,文本模式下有特殊意义的字符(如'\0'等),在二进制模式下没有意义。
(3)fprintf()函数
fprintf()函数用于从字符串中获取数据,写入文件。函数原型如下:
int fprintf( FILE* file,const char *format, ...);
【注释】
- file表示待写入字符串的文件指针;
- format表示规定子串输出的格式。
- 该函数根据指定的字符串格式,将获取的字符串传入指定的文件。
实例分析:
fprintf(fp," I am a %s, I am %d years old.", "student",18);
//最后保存到文件中文本为“ I am a studnet, I am 18 years old.”
二、写文件综合实例
#include <stdio.h>
#pragma warning(disable:4996)
int main() {
FILE *fp1, *fp2;
//对文本文件进行操作
fp1 = fopen("D:\\test.txt", "w");
//判空操作
if (fp1 == NULL) {
printf("不能打开文件test.txt\n");
return -1;
}
//写入一行字符串
fputs("张三",fp1);
//写入一个字符
fputc('\n', fp1);
//格式化写入字符串
fprintf(fp1, "I am a %s ,I am %d years old.", "student", 18);
fclose(fp1);
//对二进制文件进行操作
fp2 = fopen("E:\\test2.txt", "wb");
//判空操作
if (fp2 == NULL) {
printf("不能打开文件test.txt\n");
return -1;
}
//写入字符串
char str[] = "I am a student ,I am 18 years old.\n";
fwrite(str,sizeof(str) , 1,fp2);
fprintf(fp2, "I am a %s ,I am %d years old.", "student", 18);
fclose(fp2);
return 0;
}
运行文件test.txt结果:
test2.txt结果:
因为是二进制文件所以使用记事本打开是乱码
三、读文件
(1)读文本文件
在对文本文件进行读操作时,主要用到函数:fgetc()函数和fgets()函数
①fgetc()函数
fgetc()函数用于从文件中读取一个字符,函数原型如下:
char fgetc(FILE *fp);//fp为被读取的字符的文件指针
②fgets()函数
fgets()函数用于每次从文件中读取一行字符串,或读取指定长度的字符串。函数原型如下:
char* fgets( char* buf, int maxcount, FILE *file);
【注释】
- buf表示一个字符数组,用来存储读到的字符串
- maxcount用来指定存储数据的大小
- file表示将要读取的文件的指针
- 如果读取的字符串的长度=<maxcount-1,则fgetsf()函数返回改行的内容;否则,只返回maxcount-1个字符,fgets()函数下一次调用将继续读取改行。
(2)读二进制文件
对二进制文件进行读操作时,主要用函数:fread()函数
fread()函数用于在程序中以二进制的形式读取文件,其函数原型如下:
unsigned int fread(void* dstBuf,unsigned int elementsize,unsigned int count,FILE *file);
【注释】
- dstBuf用于存储待接收数据的指针
- elementsize表示要接收的数据项的字节数
- count 表示每次函数运行时要读取的数据项的个数
- file 表示带读取文件的指针
- 该函数每次最多从文件中读取count个大小为elementsize的元素,并返回读取的元素的个数count。
(3)fscanf()函数
fscanf()函数用于从文件中格式化地读出数据,其函数原型如下:
int fscanf( FILE *flie, const char *format...);
【注释】
- file 表示带读取文件的指针
- format表示文件中的字符串输出时遵循的格式
- 如果该函数调用成功,则返回输入的参数的个数,否则返回EOF。
四、文件位置指针
为了对读写进行控制,系统为每个文件设置了一个位置指针,用于指示文件当前读写的位置,该指针被称为文件位置指针。
当从文件头部开始,对文件进行顺序读写时,文件位置指针会伴随着读写过程逐个后移,每读写一个数据,位置指针后移一个位置。下次读写时,系统会从文件位置指针指向的位置开始读写文件。
文件位置指针可以人为移动,实现文件的随机读写。常用的控制文件位置指针的函数有三个:
(1)fseek()函数
fseek()函数的作用是将文件位置指针移动到指定位置,其函数原型为:
int fseek(FILE *fp ,long offset,int origin);
【注释】
- fp为指向文件的指针
- offset表示以参数origin为基准使文件位置指针移动的偏移量
- origin表示文件位置指针的起始位置,它有三个枚举值:SEEK_SET,SEEK_CUR,SEEK_END
- SEEK_SET:该参数对应的数值为0,表示从文件起始位置开始偏移
- SEEK_CUR:该函数对应的数值为1,表示相对于文件位置指针当前所在的位置进行偏移
- SEEK_END:该函数对应的数值为2,表示相对于文件末尾进行偏移
- 调用该函数,如果调用成功会返回0,有误返回-1。
- 该函数一般用于二进制文件,因为对文本文件进行操作时,需要进行字符转换,对位置的计算可能会发生错误。
(2)rewind()函数
rewind()函数可以将文件位置指针移动到文件的开头,函数原型如下:
void rewind( FILE *fp);
(3)ftell()函数
ftell()函数用于获取文件位置指针当前指向的位置,其函数原型如下:
long ftell(FILE *fp);
ftell()函数若调用成功,将返回文件位置指针当前所在的位置,否则,返回-1.
四、读文件综合实例
#include <stdio.h>
int main() {
FILE* fp1, * fp2;
char str[100]="I am a student ,I am 18 years old.";
//对文本文件进行操作
fp1 = fopen("D:\\test.txt", "w");
//判空操作
if (fp1 == NULL) {
printf("不能打开文件test.txt\n");
return -1;
}
printf("文本文件:\n");
fgets(str, 50, fp1);
printf("第一行数据:\n");
fscanf(fp1, "%s", &str);//格式化输出字符串
printf("%s\n", str);
fclose(fp1);
//对二进制文件进行操作
fp2 = fopen("E:\\test2.txt", "wb");
//判空操作
if (fp2 == NULL) {
printf("不能打开文件test.txt\n");
return -1;
}
fread(str, sizeof(str), 1, fp2);
printf("二进制文件:\n");
printf("%s", str);
fclose(fp2);
return 0;
}
运行结果: