测试必备技能之C语言文件函数(超级全能篇)——FILE函数

2023-05-16

之前出过的文件FILE函数的小白篇,现在出一个全面一些的
在这里插入图片描述

以下讲解直接分为函数原型+函数作用+测试用例
让大家真真正正的理解和感受这几个FILE函数的作用

二话不说,开冲!

额…先来个小表格:

在这里插入图片描述

在这里再重复一下上一篇讲述过的几个基本的FILE函数,由于这几个函数在上一个博客都有讲过,而且比较基础简单在这里就没有测试用例啦,直接简单看函数原型和作用☺☺☺
★fopen()函数

✿、函数原型:FILEfopen(charfilename,char*type);
✿、函数作用:
打开一个“流“

★fclose()函数

✿、函数原型:
int fclose(char*filename);
✿、函数作用:
关闭一个“流“

★fprintf()函数

✿、函数原型:
int fprintf(charfilename,charformat[,argument,…])(format就是要写入的参数)
✿、函数作用:
传送格式化文本形式输出到一个流中

好了,结束了上面几个在小白篇出现的三个常用FILE函数,让我们进入正题:

首先,在这里回答一个问题:

在开始接触FILE函数这一个模块的时候,先了解一下文件的类型,常见的有二进制类的,还有文本形式类的,怎么区分呢?

简记:一个是看不懂的文字,而一个是你看得懂的在这里插入图片描述
个人认为,言简意赅,十分易记

演示一波

二进制文件:
在这里插入图片描述
文本文件:
在这里插入图片描述
简单理解了之后,细细想想这两个到底有什么区别和差异,在这里我不多加赘述,这一篇是讲述FILE函数的,所以以下内容主要对我怎么写二进制文件、怎么写文本文件等等一系列操作进行函数剖析和演示,具体这两个形式有什么具体区别,我会在下一篇出♥♥♥♥♥


feof()函数
✿、函数原型:
int feof(FILE*stream);额…和前面区别一下嘛在这里插入图片描述
✿、功能:
检测流上的文件结束符
没有什么特别意思,就是检测到你的文件到末尾了,后面没有东西了♞
✿、程序用例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int main() {
	FILE* fp;
	fp = fopen("test.txt","r");
	char c = '0';//初始化中间变量
	if (fp == NULL)
	{
		printf("打开文件失败!\n");
		exit(0);
	}
	while (!feof(fp))//feof(fp)==NULL,代表已经结束,这句话非常常用
	{
		c=fgetc(fp);
		printf("%c\n",c);
	}

	if (feof(fp))
	{
		printf("We have reached the end!\n");
	}
	fclose(fp);
	return 0;
}

test.txt文件内容:
在这里插入图片描述
结果:
在这里插入图片描述
之前有些人有问到关于”空格“的问题,在这里大家可以放心,feof()函数它就是可以检测到这个文件到底有没有结束,就像这里我空了几个空格,它也会算进去的,不得不说,酷在这里插入图片描述


fgetc()函数
在上面的代码中,相信眼尖的小伙伴看到了这一句:
c=fgetc();
✿、函数原型:
int fgetc(FILE*stream);
✿、作用:
从流中读取字符(就是一个一个去读,及其好用)
✿、程序用例:
额…我写到这里我发现,咦?上面那个程序测试用例好像已经说明了这个函数的意思了
在这里插入图片描述
咳咳,那好吧,就再来其他的组合好了在这里插入图片描述


fgetchar ()、fputchar()、freopen()函数登场
✿、函数原型
int fgetchar(void);
int fputchar(char ch);
FILE *freopen(char *filename, char *type, FILE *stream);

✿、函数功能:
**fgetchar:从流中读取字符,fgetchar()其实它等价于fgetc(stdin),而且使用VS的朋友,怎么说呢,我记得好像在V C++2005年开始,fgetchar()这个函数已经被废弃了,要使用_fgetchar()代替使用,包括下面的fputchar也是前面要修改,具体看下案例代码
**fputchar:送一个字符到标准输出流(stdout)中
**freopen:将一个新的名为filename与给定的打开流stream关联,同时关闭流中的旧文件,在函数定义时的stream–它指的就是指向FILE对象的指针,该指针对象标识了要被重新打开的流

★stream常用三个值:
stdout(Standardoutput)标准输出
stdin(Standardinput)标准输入
stderr(Standarderror)标准错误

根据官网的解释就是:只是方便操作输出,比如传给一个函数等等。这时函数的输出就不是输出到文件,而是传进来的stdout文件指针,即标准输出。(stdout为例)

具体的用法如下:
✿、程序案例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(void)
{
	int c;
	FILE* fp;
	fp = freopen("test.txt","r",stdin);
	if (fp != NULL)
	{
		while ((c = _fgetchar()) != EOF)//输入功能
		{
			_fputchar(c);//输出功能
		}
	}
	fclose(fp);
	return 0;
}

test文件:
在这里插入图片描述
结果:
在这里插入图片描述


现在不改变test文本内容,让我们看一看freopen()函数的“关联”特性,我们执行以下代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(void)
{
	FILE* fp;
	printf("----让文本重定向到 stdout测试---\n");
	fp = freopen("test.txt", "a+", stdout);
	printf("该文本重新定位到到 test.txt\n");
	printf("测试结束啦啦啦!");//输出变成到文件输出去了,控制台没有这一句输出了
	fclose(fp);
	return 0;
}


结果:
test.txt文件变成:
在这里插入图片描述
会发现只要使用了这个函数,它的意思就是你将你的输出就比如printf,大家都知道这个是直接输出到控制台的,可是会发现它在你的文件中输出了,有种重新指定的意味,它关联了你所指定的文件,这也是这个函数最重要的功能之一


fscanf()函数

✿、函数原型
int fscanf(FILE *stream, char *format[,argument…]);
✿、功能
从一个流中执行格式化输入
✿、程序案例:
额…先重现让test.txt文件恢复原样:
在这里插入图片描述
ok,继续

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(void)
{
	FILE* fp;
	char c = '0';
	fp = fopen("test.txt", "r");
	while (!feof(fp))
	{
		fscanf_s(fp,"%c",&c,1);//1为缓冲区大小,就跟你用scanf_()一样
		printf("%c",c);
	}
	fclose(fp);
	return 0;
}

这个函数的作用就是跟scanf非常的像,就是简单的一个赋值的操作,也非常的常用
结果:
在这里插入图片描述
将文件中的东西通过赋值给c输出,这个函数较为简单,过过过


fwrite()函数和fread()函数姐妹花组合
前面讲的大部分用于文本文件,就比如fprintf()就是以格式化的数据写进去,fscanf_()也是一般用于文本的读取,那么对于二进制文件我们应该怎么处理呢?这两个函数便是主要用于处理二进制读写的函数

除此之外呢,这两个函数主要是读取“数据块”,看它的函数原型在这里插入图片描述

✿、函数原型
int fread(void *ptr, int size, int nitems, FILE *stream);
int fwrite(void *ptr, int size, int nitems, FILE *stream);
解释一下:
ptr指的就是表示存放输入数据的首地址(一般会用数组)
size是指数据块的字节数,nitems是指读取的数据块的个数
比如说:fread(arr,4,5,fp)意义就是从fp所指的文件中,每次读入4个字节送入到arr数组中,连续读五次
✿、功能
这两个函数相信大家字面意思也能懂了,就是一个读、一个写,就是这么狠在这里插入图片描述
具体看下在这里插入图片描述

而且而且大家一定要注意的是:在读写二进制文件时候,必须确保文件的打开形式是以二进制读写的形式打开的,即类似“rb”,"wb"等在这里插入图片描述

✿、程序案例:
举一个非常简单的例子
fwrite():

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
	FILE* fp;
	fp = fopen("test_1.data","rb+");
	int buf[40];
	char arr[40] = "\0";
	char c = '\0';
	int i = 0;
	if (fp == NULL)
	{
		printf("faile open the file\n");
		exit(0);
	}
	
	for (int i = 0; i < 5; i++)
	{
		scanf_s("%d",&buf[i]);
	}
	fwrite(buf,sizeof(int),5,fp);
	fclose(fp);
	return 0;
}

测试输入:10100
结果:在这里插入图片描述

乱码(字节大小:20(int是4,5个4=20))
在这里插入图片描述
就着上面已经有的这个二进制文件,我们用fread()函数去解读它:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
	FILE* fp;
	fp = fopen("test_1.data","rb+");
	int buf[40];
	int arr[40];
	char c = '\0';
	int i = 0;

	fseek(fp,SEEK_SET,0);//从文本开头开始读取
	fread(arr,20,1,fp);

	for (int i = 0; i < 5; i++)
	{
		printf("%d",arr[i]);
	}

	fclose(fp);
	return 0;
}

结果:在这里插入图片描述
不得不说,强大在这里插入图片描述


fseek()函数
这个函数比较简单理解,就是规定文件指针位置,比如你不想每次都从文件首部开始,想从一个特定的位置开始,那么这个函数就是起到这样一个作用的
✿、函数原型
int fseek(FILE *stream, long offset, int fromwhere);
✿、功能
重新定义流上的文件指针
offset:相对于fromwhere的偏移,以字节为单位
fromwhere:偏移的位置
一般指定为下列三个常量之一:
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾

✿、程序案例
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
	FILE* fp;
	fp = fopen("test.txt","r");
	char c = '0';
	if (fp == NULL)
	{
		printf("fail open the file!\n");
		exit(0);
	}
	printf("现在从距离起点4个字节位置开始读取:\n");
	fseek(fp,4,SEEK_SET);
	while (!feof(fp))
	{
		fscanf_s(fp,"%c",&c,1);
		printf("%c",c);
	}
	fclose(fp);
	return 0;
}

结果:
在这里插入图片描述
基于这个函数比较简单,大家可以自己去玩一玩,在这里不赘述更多的测试用例了在这里插入图片描述


ftell()函数

✿、函数原型:
long ftell(FILE *stream);
✿、功能:
返回当前文件的指针(额…就是文件字节数啦)
✿、程序测试用例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
	FILE* stream;
	stream = fopen("test.txt", "w+");
	fprintf(stream, "This is a test");
	printf("The file pointer is at byte % ld\n", ftell(stream)); 
	fclose(stream);

	return 0;
}

结果:
在这里插入图片描述
在这里插入图片描述


fgets()函数
前面讲了fgetc()函数,现在来一个它的兄弟在这里插入图片描述
✿、函数原型:

char *fgets(char *string, int n, FILE *stream);
✿、功能
从流中读取字符串
✿、程序案例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>


int main()
{
	FILE* stream;
	char string[] = "I am X BIG MONSTER";
	char msg[20];
	stream = fopen("test.txt", "w");
	fwrite(string, strlen(string), 1, stream);
	fseek(stream, 0, SEEK_SET);
	fgets(msg, strlen(string) + 1, stream);
	fclose(stream);


	return 0;
}

结果:
在这里插入图片描述

总结

还是那句话,自己多动手,就会发现奥妙之处在这里插入图片描述
可能不够完善,我会努力更哒在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试必备技能之C语言文件函数(超级全能篇)——FILE函数 的相关文章

  • 我的代码哪里有泄漏?

    下面是我的代码 它打开一个 XML 文件 old xml 过滤无效字符并写入另一个 XML 文件 abc xml 最后 我将再次加载 XML abc xml 当执行以下行时 出现异常 表示 xml 文件被另一个进程使用 xDoc Load
  • 如何读取 XML 文件并从中获取值以在 PHP 编码的 HTML 页面中显示

    我有一个 XML 文件 其中有一些重复的标签 其中包含不同的值 我需要获取这些值并显示在我的网页中 请帮助我得到这个 如果您使用 PHP5 可以查看 SimpleXML 您可以在这里找到介绍教程 http www w3schools com
  • 使用java在mysql中插入带有\\的文件路径

    我正在使用java制作一个独立的应用程序 并且我需要插入用户从文件选择器中选择的图像的路径 我正在获取文件的路径 但是当我将其存储在数据库 mysql 中时 它不会存储 所以当我检索该路径时 该文件不会显示 如何存储文件的路径 这样就可以使
  • 在asp.net中读取.ofx、.qif文件

    我想使用 asp net 读取 ofx 和 qif 文件 任何人都可以帮助我吗 谢谢 http qif codeplex com http qif codeplex com 包含用于从 NET 读取 QIF 文件的开源 API 如果您在 C
  • 使用 .NET 删除目录中超过 3 个月的文件

    我想知道 使用 C 如何删除某个目录中超过 3 个月的文件 但我想日期期限可以很灵活 需要明确的是 我正在查找超过 90 天的文件 换句话说 应保留 90 天前创建的文件 并删除所有其他文件 像这样的事情不能做 using System I
  • 是否可以合理地解决防病毒扫描工作目录的问题?

    我的 Win32 应用程序在运行时在指定的临时文件夹中执行大量磁盘操作 并且认真地重新设计它是不可能的 某些客户端具有扫描同一临时目录的防病毒软件 它只是扫描所有内容 我们试图说服他们禁用它 它不起作用 所以它也是不可能的 每隔一段时间 例
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 如何在头文件中声明一个由c中的多个文件使用的结构?

    如果我有一个带有结构的 source c 文件 struct a int i struct b int j 如何在另一个文件中使用这个结构 即func c 我应该创建一个新的头文件 在那里声明结构并将该头包含在func c 或者我应该在头文
  • 如何从 Emacs 中检出 Perforce 下的文件?

    我在工作中使用 Perforce 进行源代码控制 并且希望从 Emacs 中 打开以进行编辑 源代码控制下的文件 那怎么办呢 我需要在 Emacs 中设置什么 有插件吗 我还想执行其他 p4 操作 例如提交我的更改等 Perforce Em
  • 文件构造函数说明

    我无法理解以下文件构造函数 public File String parent String child and public File File parent String child 参数有什么作用parent and child该文件
  • 追加文件会导致覆盖 (Java)

    因此 我正在创建一个 CSV 文件 每次发生操作时我都想将数据写入该文件 我遇到的问题是 第二次输入时它会覆盖数据 如何将数据添加到文件末尾 public boolean save to csv check if directory exi
  • 在 Android 中哪里可以找到应用程序数据

    我的目标是将应用程序中的数据保存在文本文件中以供进一步分析 我使用了给出的确切代码here http www mysamplecode com 2012 06 android internal external storage html用于
  • Java-使用InputStream作为文件

    我正在尝试使用上传的 docx 文件生成 PDF 文档JOD转换器 http www artofsolving com opensource jodconverter 对生成 PDF 的方法的调用如下所示 File inputFile ne
  • 比较方法在对文件进行排序时违反了其一般契约

    我知道这种异常有很多问题 而且我确实找到了解决方案 但我的问题是不同项目中的相同代码不会抛出异常 而这个却抛出异常 这两个项目都具有相同版本的 Java 和其他库 基本上我有一个小函数 它从目录中检索文件列表 按时间戳对它们进行排序 然后返
  • 读取多个文件 cotent 的 React JS

    我正在尝试使用 React js 读取多个文件 但我的代码只读取一个文件 而不会读取其余文件 有什么建议吗 Thanks constructor props super props this state files changedFileI
  • Java 错误:java.io.FileNotFoundException:C:\Users\FSSD\Desktop\My Test(访问被拒绝)

    我有一个java代码 用于将文件从一个文件夹复制到另一个文件夹 我使用了以下代码 我使用的是Windows 7操作系统 复制文件夹 java import java io File import java io FileInputStrea
  • Java IO 文件前缀字符串太短 - 但事实并非如此

    尝试从一个目录创建简单的 tar gz 文件 有我的代码 File destinationFile new File var www swOfflineFeeds Companies 2 File sourceFile new File v
  • .bat 文件将文件排序到文件夹中

    对于我的图片集 我希望文件夹中的所有图片按日期自动分类到文件夹中 幸运的是 这些文件已经以时间戳命名 2012 07 15 12 21 06 jpg 2012 07 15 12 21 26 jpg 2012 07 16 12 12 50 j
  • C# 写入文件的性能

    我的情况概述 我的任务是从文件中读取字符串 并将它们重新格式化为更有用的格式 重新格式化输入后 我必须将其写入输出文件 这是必须完成的操作的示例 文件行示例 ANO 2010 CPF 17834368168 YEARS 2010 2009
  • 拒绝访问特定目录中的特定文件类型

    对于某些应用程序 用户可以上传自己的文件 由于这可能是非常大的文件 因此他们可以通过自己的 FTP 客户端上传这些文件 当然 我不希望他们上传一些可以访问服务器上所有其他文件的 PHP 文件 我想要防止这种行为的方法之一是拒绝仅访问这些文件

随机推荐