【C】文件操作(你想要的表格在目录二、三,有函数讲解)

本文详细介绍了C语言中文件的分类,包括程序文件和数据文件,重点讲解了文件指针、各种文件打开模式、常用的文件操作函数如fgetc、fputc、fgets、fputs等,以及检测函数feof和ferror的用法,还演示了fseek、ftell和rewind的功能。
摘要由CSDN通过智能技术生成

一、文件分类

1.程序文件

文件后缀为:.c(源程序文件)     .obj(编译后的目标文件)       .exe(可执行程序) 

2.数据文件

储存数据的文件,如:.txt   .jpg   .log等都是数据文件

二、文件的使用

 2.1文件指针

指向文件的信息区,指针类型为FILE*,每次打开文件指针都会在文件开头。

FILE* pfs1;//创建一个文件指针
//通过指针操作文件

 2.2文件打开和关闭

pfs1 = fopen("test.txt", "w");//以写的方式打开 test.txt 文件

fclose(pfs1);//关闭 test.txt 文件

*文件的打开方式

打开方式权限                                 作用若文件不在
"r"只读读取文件数据出错
"w"只写在文件中写入数据创建一个新文件
"a"追加在文件末尾添加新数据创建一个新文件
"rb"只读以二进制打开文件,读取文件数据出错
"rw"只写以二进制打开文件,在文件中写入数据创建一个新文件
"ra"追加以二进制打开文件,在文件末尾添加新数据创建一个新文件
"r+"读写在文件中读取或写入数据出错
"w+"读写在文件中读取或写入数据创建一个新文件
"a+"读写在文件末尾读取或写入数据创建一个新文件
"rb+"读写以二进制打开文件,在文件中读取或写入数据出错
"wb+"读写以二进制打开文件,在文件中读取或写入数据创建一个新文件
"ab+"读写以二进制打开文件,在文件末尾读取或写入数据创建一个新文件

三、文件的操作函数

         函数                                功能                  适用范围
        fgetc()从文件中读取一个字符所有输入流
        fputc()输出一个字符到文件中所有输出流
        fgets()从文件中读取一串字符所有输入流
        fputs()输出一串字符到文件中所有输出流
        fscanf()在文件中格式化读取字符所有输入流
        fprintf()格式化输出字符到文件中所有输出流
        fread()以二进制读取文件文件
        fwrite()以二进制输出至文件文件

3.1函数 fgetc()和fputc()

fgetc

int fgetc ( FILE * stream );

读取 stream 指针指向的文件中的一个光标指向的字符,然后光标向后移动一位。

读取成功返回该字符。

读到文件末尾或发生读取错误,返回 EOF(-1) 。

示例代码:

FILE* pfs1;

pfs1 = fopen("test.txt", "r");//以读("r")的方式打开文件(在源文件所在的目录里没有此文件就会返回NULL)

if (pfs1 != NULL)//检测是否打开错误
{
	int ret;

    while ((ret = fgetc(pfs1))!= EOF)//将读取的字符赋值给 ret ,如果未读到末尾,则继续读取
    {
	    printf("%c ", ret);
    }

	fclose(pfs1);//关闭文件
	pfs1 = NULL;
}

fputc

int fputc ( int character, FILE * stream );

将 character 写入 stream 指针所指的文件,然后光标向后移一位。

写入成功返回 character 。

写入失败返回EOF。

*注:每次打开文件,光标都会在第一的位置,也就是说存在新数据覆盖旧数据

示例代码:

FILE* pfs1;

pfs1 = fopen("test.txt", "w");//以写("w")的方式打开文件
if (pfs1 != NULL)//检测打开是否失败
{
	for (int i = 'a'; i <='f'; i++)//依次输入a到f的字母
	{
		fputc(i, pfs1);//如果文件本来就有一些数据,那新数据就会覆盖旧数据
	}

	fclose(pfs1);//关闭文件
	pfs1 = NULL;
}

3.2函数fgtes()和fputs()

fgets

char * fgets ( char * str, int num, FILE * stream );

将 stream 指针指向的文件的 num-1 个数据赋值给 str(因为 fgets 会在读取末尾自动添加一个 '\0' ,所以 num 会少一位)。

如果读取过程中遇到了 '\n' ,则在读取' \n' 之后停止读取(末尾也会加上'\0')

如果读取成功,则返回str

如果读取失败,则返回NULL

 示例代码:

FILE* pfs1;
char arr[256] = "xxxxxxxxxxxxxxx";//arr中的数据会被fgets改变(从arr[0]开始)

pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
	fgets(arr, 5, pfs1);

	fclose(pfs1);
	pfs1 = NULL;
}
	

fputs

int fputs ( const char * str, FILE * stream );

将 str 指向的数据全写入 stream 指向的文件中,str 的'\0'不会写入文件。

写入成功返回非负数

写入失败返回EOF

 示例代码:

FILE* pfs1;

char* p = "asdfghjkl";

pfs1 = fopen("test.txt", "w");
if (pfs1 != NULL)
{
	
	fputs(p, pfs1);

	fclose(pfs1);
	pfs1 = NULL;
}

3.3fscanf()和fprintf()

fscanf

int fscanf ( FILE * stream, const char * format, ... );

与 scanf 相似,只不过 scanf 读取的是键盘输入的数据,fscanf 读取的是文件里的数据。

fscanf 读取数据知道遇到空白字符(也可以是\n)。

读取成功返回填充的项数

读取失败则返回EOF

 示例代码:

FILE* pfs1;
char p[20];
int a;
float f;

pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
	int r;
	while ((r = fscanf(pfs1, "%s %d %f", p, &a, &f))!= EOF && r != 0 )//检测读取是否出现故障或读取完毕
	{
		switch (r)//打印 fscanf 读取成功的数据
		{
		case 1:
			printf("%s\n", p);
			break;
		case 2:
			printf("%s %d \n", p, a);
			break;
		case 3:
			printf("%s %d %f\n", p, a, f);
			break;
		}
		
	}
	
	fclose(pfs1);
	pfs1 = NULL;
}
	

fprintf

int fprintf ( FILE * stream, const char * format, ... );

与 printf 相似,只不过 printf 输出的到屏幕,fprinf 输出到文件。

输出成功返回写入的字符总数。

输出失败返回一个负数。

示例代码:

FILE* pfs1;
char p[20]="你好世界";
int a=1024;
float f=1.000001;

pfs1 = fopen("test.txt", "w");
if (pfs1 != NULL)
{
	fprintf(pfs1, "%s %d %f", p, a, f);
	
	fclose(pfs1);
	pfs1 = NULL;
}

3.4fread()和fwrite()

fread

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

读取 stream 指针指向的文件中总数为 count 个大小为 size 字节的二进制数据到 ptr 中

读取成功返回读取的元素总数(count)

读取失败或读取到文件末尾返回的的数不是 count

如果 size 或 count 有一个为0,则返回0

示例代码:

    ILE* pfs1;
	char p[20]="你好世界";


	pfs1 = fopen("test.txt", "r");
	if (pfs1 != NULL)
	{
		fread(p, 2, 5, pfs1);

		printf("%s", p);
		
		fclose(pfs1);
		pfs1 = NULL;
	}

fwrite

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

将 ptr 中的 count 个大小为 size 的元素以二进制写入 stream 指针指向的文件

写入成功返回写入的元素总数(count)

写入失败返回的数不为count

如果 size 或 count 有一个为0,则返回0

 示例代码:

FILE* pfs1;
char p[20]="你好世界";


pfs1 = fopen("test.txt", "w");
if (pfs1 != NULL)
{
	fwrite(p, 2, 4, pfs1);

	printf("%s", p);
	
	fclose(pfs1);
	pfs1 = NULL;
}
	

四、检测函数ferror()和feof()

feof

int feof ( FILE * stream );

检测 stream 因什么结束

因读写到文件末尾结束,返回非0数

不因读写到文件末尾结束,返回0

 ——————————————————————————————————————————

ferror

int ferror ( FILE * stream );

检测 stream 因什么结束

不因读写错误结束,返回非0数

因读写错误结束,返回0

 示例代码:

FILE* pfs1;
char p[20]="你好世界";


pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
	while (fread(p, 2, 1, pfs1) == 1);//一直读取文件

	if (feof)//检测是否因读到文件末尾结束读取
	{
		printf("读取到文件末尾\n");
	}
	else
	{
		if (ferror)//检测是否因读取错误结束
		{
			printf("读取发生错误\n");
		}
	}
	fclose(pfs1);
	pfs1 = NULL;
}

五、随机读取 

 5.1 fseek()函数

fseek

int fseek ( FILE * stream, long int offset, int origin );

将 stream 指针指向的文件的光标设置在 origin 位置,然后再向前移动 offset 个位置。

成功返回0

失败返回非0数

示例代码:

FILE* pfs1;
pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
                    //SEEK_END 尾部   SEEK_SET 开头  SEEK_CUR 光标当前所在位置
	fseek(pfs1, -2, SEEK_END);//起始光标在文件尾,光标向前移动-2个位置
	char ch = fgetc(pfs1);
	printf("%c", ch);//文件为:ABCDE|      光标移动:ABC|DE      输出结果为:D
                                 //^光标             //^光标

	fclose(pfs1);
	pfs1 = NULL;
}

5.2 ftell()函数

ftell

long int ftell ( FILE * stream );

返回 stream 指针指向的文件的光标从初始位置到所在位置的距离(long int

 

失败,返回-1

示例代码:

FILE* pfs1;
pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
	fseek(pfs1, -2, SEEK_END);
	int ret = ftell(pfs1);
	printf("%d",ret);


	fclose(pfs1);
	pfs1 = NULL;
}
	

5.3 rewind()函数

rewind

void rewind ( FILE * stream );

让光标返回初始位置

示例代码:

FILE* pfs1;
pfs1 = fopen("test.txt", "r");
if (pfs1 != NULL)
{
	fseek(pfs1, -2, SEEK_END);

	rewind(pfs1);
	
	int ret = ftell(pfs1);
	printf("%d",ret);


	fclose(pfs1);
	pfs1 = NULL;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值