c 语言打开文件弹出debug assert failed

翻遍全网的解答,看了将近一个小时的博客,还是没有解答,直到我即将放弃的时候,
基本翻遍全网关于解决为什么打开文件就弹出debug assert failed 弹窗的问题
仍然得不到解答。
后来精简代码,一行一行的注释,再放开,直到我发现问题的时候,我恭喜自己又一次被自己蠢到了。
写一个博客,以此留念。如果有犯同样错误的,也可以相互借鉴。

写法如下:

	FILE* fp = fopen("E:\\test.txt", "w");
  if (fp== NULL)
	{
		perror("fopen");
		system("pause");
		return 1;
	}

	fp = NULL;
	fclose(fp);
	

弹窗警告⚠

在这里插入图片描述
打开文件fopen 没有问题
那问题出在哪里呢?

FILE* fp = fopen("E:\\test.txt", "w");
	if (fp== NULL)
	{
		perror("fopen");
		system("pause");
		return 1;
	}
	fclose(fp);
	fp = NULL;

关键问题出错点
请注意对比后两行代码的顺序
先关闭文件指针,然后再将指针设置为空值。

我们再关闭文件的时候,到底做了什么?
官方解释如下:
关闭档案
关闭与流关联的文件并取消关联。
与该流关联的所有内部缓冲区都将与该流取消关联并刷新:将写入所有未写输出缓冲区的内容,并丢弃所有未读输入缓冲区的内容。
即使调用失败,作为参数传递的流也将不再与文件或其缓冲区关联。

个人觉得和之前了解到一些概念有一点像,首先在关闭文件之前,刷新文件,之后关闭文件。文件的指针依旧指向该文件,只是解除了操作关系。最后将该指针的内容设置为空。

这里和释放指针有一点点类似:
free§;
//只是将p和所指向的那块内存取消联系,解除绑定,但是p本身保存的地址并没有改变,只是没有使用权了,那块内存的值也没有变,只是没有办法使用了。
free后,指针指向的内存被释放,但是指针仍然是存在的
此时的指针被称为“迷途指针”,就像迷途的羔羊一样
也称为“空悬指针”“悬浮指针”“野指针”。这个时候要把指针重新初始化为NULL后才能再使用,否则会得到我们不想要的结果。

举一个生活化的例子:
大致就是,男女朋友分手以后解除的是恋爱的关系,也就是指针操作文件的关系,但是这并不影响你可以继续偷偷观察你的前任。大概就是这么个意思吧哈哈哈哈哈

如果先将指针设置为空,再关闭文件,由于指针已经不指向文件,没有办法正常关闭文件。
最后,感谢一下给我启发,想到问题出在哪里的作者和他的博客
参考博客

在C语言中,"debug assertion failed"通常是在程序执行过程中遇到编译器或运行时环境内置的断言检查失败时抛出的一个错误。断言是程序员用来检查程序内部条件的一种机制,它们通常包含一些预设为真的条件,如果这些条件在特定情况下不满足,就会触发错误,提示开发者程序中的某个假设出现了问题。 当看到这样的错误信息时,可能的情况有: 1. 你在代码中使用了`assert`宏,这个宏在调试模式下(通常通过`#define NDEBUG`关闭)不会被启用,但在发布版本中会检查其内的表达式是否为真。如果为假,就会显示"assertion failed",表示你在某个关键点上发现了一个异常条件。 2. 某个动态内存分配失败,如`malloc`或`calloc`返回`NULL`,但代码中依赖于其成功。 3. 数组越界、指针访问非法内存、类型转换错误等可能导致的未定义行为。 解决这个问题的步骤包括: 1. **检查断言条件**:查看错误时的代码行,理解`assert`检查的条件是什么,为何在这个时候失败。 2. **重现错误**:尝试复现导致断言失败的输入或操作,这有助于定位问题。 3. **日志输出**:如果没有显式的断言,可能是隐含的错误,如数组长度不足,检查相关的变量值和计算过程。 4. **使用调试工具**:使用调试器(如GDB)逐步执行,观察程序状态变化,找出问题所在。 5. **错误日志**:如果程序有记录错误日志功能,查看是否有其他有用的上下文信息。 6. **修复代码**:根据错误原因修改代码,确保所有条件检查正确,避免潜在的bug。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值