C语言文件操作简介

目录

前言

一、文件

二、文件的打开与关闭

1.文件的打开函数fopen()

2.文件关闭函数fclose()

三、文件的读写

1.字符的输入输出

(1)读字符函数fgetc( )

(2)写字符函数fputc()

2.字符串的输入和输出

(1)fgets()函数

(2)fputs()函数

3.按格式化输入和输出

4.数据块的输入和输出

四、文件的定位

1.rewind()函数

2.fseek()函数和随机读写

3.其他函数


前言

        本篇文章将简单介绍一下C语言中的文件的操作以及相关函数的使用方法。

一、文件

文件:文件是一组相关信息的集合。文件通常是驻留在外部介质(如磁盘等)上的,在使用时才会调入内存中。

缓冲文件系统:缓冲文件系统时当程序打开一个文件的同时,系统自动地在内存中为该文件开辟一个内存缓冲区,C语言对文件的所以操作都通过对文件缓冲区的操作来完成。使用缓冲文件系统可以大大提高文件操作的速度。

文件型指针:FILE * 指针变量标识符;

二、文件的打开与关闭

1.文件的打开函数fopen()

fopen()函数用来打开一个文件,其调用格式如下:

文件指针名=fopen(文件名,使用文件方式)

FILE *fp;

fp=fopen(“test.txt”,"r");

这串代码的意义是在当前目录下打开文件test.txt,只允许进行读操作,并使fp指向该文件。

fp=fopen("D:\\test.txt","r");

采用相对地址的打开方式一样可行。

下面附上C语言文件操作方式的一份表格

下面附上在打开文件时判断文件是否为空的一个if语句

if (NULL == pf)
{
	perror("fopen");
	return 1;
}

2.文件关闭函数fclose()

fclose()函数调用的一般形式如下:

fclose(文件指针)

三、文件的读写

        在C语言中,scanf()和printf()函数针对键盘输入和屏幕输出的标准函数。同时C语言也为磁盘数据文件的读写提供了四种文件存取方法。

1.字符的输入输出

(1)读字符函数fgetc( )

fgetc()函数的功能时从指定的文件中读一个字符,函数调用的形式如下:

字符变量=fget(文件指针); 

ch=fgetc(fp);表示从打开的文件fp中读取一个字符并送人ch中。

还有需要注意的一点就是fetc()时一个一个字符的读写

int main()
{
	//打开文件
	FILE* pf = fopen("test.txt", "r");

	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	//读文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}


	//关闭文件
	fclose(pf);
	pf = NULL;

	return 0;
}

(2)写字符函数fputc()

fputc()函数的功能时把一个字符写入指定的文件中,函数调用的形式如下:

fputc(字符量,文件指针);

fputc("a",fp);的意义就是把字符a写入fp所指向的文件中。

需注意:

fputc()有一个返回值,若写入成功则返回写入的字符,否则返回EOF,可用此来判断写入是否成功。

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

2.字符串的输入和输出

字符串读写函数只能对文本文件进行读写,读写文件时一次读取或写入的时字符串。

(1)fgets()函数

调用格式如下:

fgets(s,n,fp);

其中,s是字符型指针变量或字符数组名,n是指定读入的字符个数。调用该函数时,从fp所指向的文件读取n-1发字符,存入s所指向内存地址起始的n-1个连续的内存单元中。

	char arr[20] = "#########";
	fgets(arr, 20, pf);
	printf("%s", arr);
	
	fgets(arr, 20, pf);
	printf("%s", arr);

 

注意:若n-1个字符读入完成前遇到'换行符'\n'或者文件结束,将停止读入。若函数执行成功,将返回所读取的字符串,失败则会返回空指针,此时s的内容不能确定。

(2)fputs()函数

fputs(字符串,文件类型指针);

其中,s可以是字符串常量、字符型指针变量或者字符数组名。该函数会把字符串s写入fp所指向的文件时,字符串s的结束标记'\0'不会写入文件。若函数执行成功,则函数返回所写的最后一个字符;否则函数返回EOF。

	fputs("hello\n", pf);
	fputs("world\n", pf);

3.按格式化输入和输出

fscanf()函数用于从指定文件中按照指定格式读取数据保存到变量

fprinf()函数用于按指定格式向指定文件写入数据

当文件类指针定义为stdin和stdout时,这两个函数的功能就与scanf()和printf()相同

函数调用格式如下:

fscanf(文件指针,格式化字符串,输入列表);

fprintf(文件指针,格式化字符串,输出列表);

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan", 20, 95.5f };

	FILE*pf = fopen("test.txt", "w");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	fprintf(pf, "%s %d %.1f", s.name, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

 

struct S
{
	char name[20];
	int age;
	float score;
};

int main()
{
	struct S s = {0};

	FILE* pf = fopen("test.txt", "r");
	if (NULL == pf)
	{
		perror("fopen");
		return 1;
	}

	fscanf(pf, "%s %d %f", s.name, &(s.age), &(s.score));


	printf("%s %d %f\n", s.name, s.age, s.score);

	fclose(pf);
	pf = NULL;
	return 0;
}

 

在这里再加上另外一个知识点:

scanf:按照一段的格式从键盘输入数据

printf:按照一定的格式把数据打印(输出)到屏幕上

//适用于标准输入/输出流的格式化的输入/输出语句

fscanf:按照一点的格式从输入流(文件/stdin)输入数据

fprintf:按照一点的格式从输出流(文件/stdout)输出数据

//适用于所有的输入/输出流的格式化输入/输出语句

sscanf:从字符串中按照一定的格式读取出格式化的数据

sprintf:把格式化数据按照一定的格式转换成字符串

4.数据块的输入和输出

C语言提供了用于整块数据的读写函数fread()和fwrite(),比较适用与随机文件的读写,可用来读写一组数据。

读数据块调用的一般形式如下:

fread(buffer,size,count,fp);

写数据块函数调用的一般形式如下:

fwrite(buffer,size,count,fp);

其中,buffer是一个指针,在fread()函数中,它表示存放输入数据的首地址;在fwrite()函数中,它表示存放输出数据的首地址。

size        表示数据块的字节数

count     表示读写的数据块块数

fp           表示文件指针

 fread(fa,4,5,fp);意义是从fp所指的文件,每次读4个字节(一个实数)送人实数组fa中,连续读5次,即读五个实数到fa中。

fwrite(&s, sizeof(s), 1, pf);
printf("%s %d %f\n", s.name, s.age, s.score);

四、文件的定位

        移动文件内部位置指针的函数主要有两个,即rewind()函数和fseek()函数。

1.rewind()函数

函数调用形式如下:

rewind(fp);

该函数用于定位,使文件的位置指针重新返回文件的开头。其中fp是指向某一磁盘文件的文件类型指针。

2.fseek()函数和随机读写

        对流式文件可以进行顺序读写,也可以进行随机对象。如果文件中的位置指针按字节顺序移动,就是顺序读写;如果位置指针可以随意移动位置,就可以实现随机读写。fseek()函数就可以改变文件的位置指针。

fseek()函数的调用形式如下:

fseek(fp,offset,base);

其中,fp式文件指针,指向被移动的文件;

offset是位移量,表示移动的字节数,要求唯一量是long型数据,以便在文件长度大于64KB时不会出错。当用常量文件表示位移量时,要求加后缀”L“;

base是起始点,表示从何处开始计算位移量,规定的起始点有三种:文件首、当前位置和文件尾部。

 fseek(fp,100L,0);

其一样是把位置指针移动到离文件首的100给字节处。

注意:fseek()函数一般用于二进制文件。

int main()
{
	FILE*pf = fopen("test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen()");
		return 1;
	}
	//读文件
	int ch = fgetc(pf);
	printf("%c\n", ch);
	fseek(pf, 2, SEEK_CUR);

	ch = fgetc(pf);
	printf("%c\n", ch);

	rewind(pf);
	
	ch = fgetc(pf);
	printf("%c\n", ch);

	fclose(pf);
	pf = NULL;
	return 0;
}

3.其他函数

frell()函数

frell()函数的调用形式如下:

long ftell(fp);

ftell()函数返回文件位置指示器的当前值,这个值是指示器从文件头开始算的字节数,返回的数为长整型,当返回-1时,表示错误。

    printf("%c\n", ch);//a
	fseek(pf, 2, SEEK_CUR);

	ch = fgetc(pf);
	printf("%c\n", ch);//d

	int pos = ftell(pf);
	printf("%d\n", pos);

	rewind(pf);
	
	ch = fgetc(pf);
	printf("%c\n", ch);

到这里,本篇文字就已经接近尾声了,感谢大家的阅览,文章内容若有错误欢迎指出改正。

文章存在多处借鉴,若有侵权请联系删除!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值