C语言—文件函数操作详解及使用示例

目录

为什么要使用文件

文件名

文件类型指针

文件的打开和关闭

文件操作函数 

字符输出函数 fputc

字符输入函数 fgetc

 文本行输出函数 fputs

 文本行输人函数 fgets 

fprintf格式化输出函数

fscanf格式化输入函数 

 二进制输出函数 fwrite

文件指针位置操作函数  

fseek 文件指针定位函数

ftell 返回文件指针相对于起始位置的偏移量

rewind 让文件指针的位置回到文件的起始位置

总结:文件是否结束判断




为什么要使用文件

       平时我们写代码的时候创建的变量等数据在程序结束后便会销毁,为了使数据更加长久化,就要使用文件。

文件名

      一个文件要有一个唯一的文件标识,以便用户识别和使用。

      文件名包含三个部分:文件路径+文件名主干+文件后缀

      例如:c:\code\test.txt

文件类型指针

    文件类型指针简称为文件指针

    每个被使用的文件都在内存中开辟了一个相应的信息文件区,用来存放文件的相关信息。这些信息被保存在一个结构体变量中的。这类结构体有自动声明。取名为FILE。

   只要使用一个文件,就会创建一个相应信息区。

文件的打开和关闭

    文件在使用之前要打开,使用之后要关闭。

    在编写程序时,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,相当于建立了指针和文件的关系。

    打开文件:FILE * fopen("文件名""打开方式")   一定不要忘记双引号哦!

              文件名:如果不写文件路径只写文件名主干,则会打开该目录(代码运行目录)下的文件

              操作方式:如图(下面的示例将会围绕较为常见的几个操作方式展示)

文件使用方式 含义 如果指定文件不存在
"r"(只读) 为了输入数据,打开一个已经存在的文本文件 出错
“w”(只写) 为了输出数据,打开一个文本文件 建立一个新的文件
“a”(追加) 向文本文件尾添加数据 建立一个新的文件
“rb”(只读) 为了输入数据,打开一个二进制文件 出错
“wb”(只写) 为了输出数据,打开一个二进制文件 建立一个新的文件
“ab”(追加) 向一个二进制文件尾添加数据 出错
“r+”(读写) 为了读和写,打开一个文本文件 出错
“w+”(读写) 为了读和写,建议一个新的文件 建立一个新的文件
“a+”(读写) 打开一个文件,在文件尾进行读写 建立一个新的文件
“rb+”(读写) 为了读和写打开一个二进制文件 出错
“wb+”(读写) 为了读和写,新建一个新的二进制文件 建立一个新的文件
“ab+”(读写) 打开一个二进制文件,在文件尾进行读和写 建立一个新的文件

                    输出输入如何定义:内存中的数据——>屏幕、文件   叫输出

                                                    键盘、文件——>内存中              叫输入

                   在打开文件的代码后最好跟上一句

                   以“写数据”的方式打开文件的时候,会把文件之前的数据全部清除,如果想在原有数据上增加,请用“追加”方式

if(pf==NULL)
printf("打开文件失败-%s\n",strerror(errno));

                   用于打印文件打开失败原因,方便程序检查(注:strerror函数需要引用头文件             <string.h>)

      关闭文件:int fclose(打开文件的指针)

文件操作函数 

一览表:
功能 函数名 适用于
字符输入函数 fgetc 所有输入流
字符输出函数 fputc

所有输出流

文本行输入函数 fgets 所有输入流
文本行输出函数 fputs 所有输出流
格式化输入函数 fscanf 所有输入流
格式化输出函数 fprintf 所有输出流
二进制输入 fread 文件
二进制输出 fwrite 文件

          这里的输出输入流就是文件信息区的一种,只把它理解为输出输入方式即可,比如标              准输入流其实就是键盘。标准输出流其实就是屏幕。

字符输出函数 fputc

  使用方法 fgetc(字符或字符变量,文件指针) 写一个

  代码示例:在data.txt里面输出字母表

  函数返回值:读取失败返回EOF(-1),读取成功返回写入字符 

#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	char ch = 0;
	for (ch = 'a';ch <= 'z'; ch++)
	{
		fputc(ch, pf);
	}
	fclose(pf);
	pf = NULL;//使用后的指针不要忘记化为空指针(规范编译 没有也行)
}

      代码运行结果  

      

 首先我们可以看到文件已经创建成功了(“w”打开方式下,如果没有目标文件则会创建文件)

输出成功!好耶!

字符输入函数 fgetc

     使用方法:fgetc(文件指针)    读一个

     值得一提的是fetc函数读取的时候会保存进度,就是第一次读第一个字符,第二次读第二个.......

     代码示例:读取刚刚的data.text

     函数返回值:读取失败返回EOF(-1),读取成功返回写入字符 

#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	int ch = 0;//这里创建int的目的是既可以接收char类型又可以接收EOF(-1)
	while ((ch = fgetc(pf) )!= EOF)
	{
		printf("%c ", ch);
	}
    fclose(pf);
	pf = NULL;
}

运行结果

 成功!

 文本行输出函数 fputs

     使用方法:fgets(字符串,文件指针)      就是写一行

     函数返回值:读取失败返回EOF(-1),读取成功返回写入字符串

     代码示例:写两句话

#include<stdio.h>
#include<string.h>
int main()
{
	FILE* pf = fopen("data.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
	}
	fputs("gagagaga\n", pf);
 	fputs("gagagaga\n", pf);
    fclose(pf);
	pf = NULL;
}
//就不写return 0!

 文本行输人函数 fgets 

     使用方法:fgets(目标指针,字符个数,文件指针) 就是读一行

     字符串末尾隐含一个/0,

     函数返回值:读取失败返回EOF(-1),读取成功返回写入字符串

     代码示例:把刚才的读出来

#include<stdio.h>
#include<string.h>
int main()
{
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		printf("%s", strerror(errno));
	}
	char arr[15] = { 0 };
	fgets(arr, 10, p);
	printf("%s", arr);
	fgets(arr,10, p);
	printf("%s", arr);
    fclose(p);
    p = NULL;
	return 0;
}

这里如果字符个数是9或者8都不对,虽然字符串显示为gagagagaga 实则 gagagaga/n/0

运行结果

fprintf格式化输出函数

       使用方法:fprintf(文件指针,“输出类型(多个)”,输出变量(多个))

           类比于: printf(“输出类型(多个)”,输出变量(多个)) 只多了一个文件指针而已

       代码示例:读一个结构体

#include<stdio.h>
#include<string.h>
struct student
{
	char name[15];
	int age;
	char sex[6];
};
int main()
{
	FILE* p = fopen("data.txt", "w");
	if (p == NULL)
	{
		printf("%s", strerror(errno));
	}
	struct student a = { "liming",18,"man" };
	fprintf(p, "%s %d %s", a.name, a.age, a.sex);
	fclose(p);
	p = NULL;
	return 0;
}

 运行结果

 

fscanf格式化输入函数 

       使用方法:fscanf(文件指针,“输入类型(多个)”,输入指针(多个))

            这次的输入指针时内存中的指针,即用来保存得到的数据

           类比于: scanf(“输入类型(多个)”,输入指针(多个)) 只多了一个文件指针而已

       代码示例:读一个结构体

#include<stdio.h>
#include<string.h>
struct student
{
	char name[15];
	int age;
	char sex[6];
};
int main()
{
	struct student s = { 0 };
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		printf("%s", strerror(errno));
	}
	fscanf(p, "%s %d %s", s.name, &s.age, s.sex);
	printf("%s %d %s", s.name, s.age, s.sex);
	fclose(p);
	p = NULL;
	return 0;
}

       运行结果:

 二进制输出函数 fwrite

        使用方法:fwrite(内存指针,写入数据块大小,写入数据块个数,文件指针)

        代码示例:写两个结构体

         返回值为写入数据块个数

#include<stdio.h>
#include<string.h>
struct student
{
	char name[15];
	int age;
	char sex[6];
};
int main()
{
	FILE* p = fopen("data.txt", "w");
	if (p == NULL)
	{
		printf("%s", strerror(errno));
	}
	struct student a = { "liming",18,"man" };
	struct student b = { "xiaohong",18,"woman" };
	fwrite(&a, sizeof(a), 1, p);
	fwrite(&b, sizeof(b), 1, p);
	fclose(p);
	p = NULL;
	return 0;

}

        运行结果:

有乱码就对了!因为是二进制写入! 

二进制输入函数 fread 

        使用方法:fread(内存指针,读取数据块大小,读取数据块个数,文件指针)

        代码示例:读两个结构体

        返回值为读取数据块个数

#include<stdio.h>
#include<string.h>
struct student
{
	char name[15];
	int age;
	char sex[6];
};
int main()
{
	FILE* p = fopen("data.txt", "r");
	if (p == NULL)
	{
		printf("%s", strerror(errno));
	}
	struct student a = { 0 };
	fread(&a, sizeof(struct student), 1, p);
	printf("%s %d %s\n", a.name, a.age, a.sex);
	fread(&a, sizeof(struct student), 1, p);
	printf("%s %d %s\n", a.name, a.age, a.sex);
	fclose(p);
	p = NULL;
	return 0;
}

        运行结果

文件指针位置操作函数  

fseek 文件指针定位函数

          fseek(文件指针,偏移量,文件内起始偏移起始位置)

          SEEK_CUR 当前指针位置指针

          SEEK_SET 文件起始位置指针

          SEEK_END 文件末尾位置指针

ftell 返回文件指针相对于起始位置的偏移量

         ftell(文件指针)

rewind 让文件指针的位置回到文件的起始位置

       rewind(文件指针)

总结:文件是否结束判断

       fgetc判断返还是否为EOF

       fgets判断返回是否为NULL

       fread判断返回值是否比实际要读个数小

feol函数不能判定函数是否结束,而是判断函数已经结束,是读取失败结束,还是文件尾结束

ferror返回 1 的时候说明是读取失败结束

feol返回1的时候说明是文件尾结束

猜你喜欢

转载自blog.csdn.net/chara9885/article/details/125938314
今日推荐