【C语言】文件读写操作详细介绍

目录

一、写文件

(1)写文本文件

         (2)写二进制文件

(3)fprintf()函数

二、写文件综合实例

三、读文件

(1)读文本文件

(2)读二进制文件

(3)fscanf()函数

四、文件位置指针

(1)fseek()函数

(2)rewind()函数

(3)ftell()函数

四、读文件综合实例


一、写文件

文件分为文本文件和二进制文件,因为它们的存放形式不同,所以写文件的方法也不一样。

(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;
}

运行结果:

猜你喜欢

转载自blog.csdn.net/Jacky_Feng/article/details/109259220