fopen函数打开文件失败原因_为什么打开文件失败

fopen函数打开文件失败原因_为什么打开文件失败大家好,我是疯狂的比特,一个每天在互联网上种菜和砍柴的程序员今天给大家分享一个C语言初学者常见的一个问题。问题经常有人问我,我的C语言代码好好的,怎么就打开文件失败了呢?我们先来看看代码吧#include<stdio.h>#include<stdlib.h>intmain(){ FILE*pfRead=fopen(“test.txt”,”r”); if(pfRead==NULL) { printf(“打开文件test.txt失败啦\

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

大家好,我是疯狂的比特,一个每天在互联网上种菜和砍柴的程序员
今天给大家分享一个C语言初学者常见的一个问题。

问题

经常有人问我,我的C语言代码好好的,怎么就打开文件失败了呢?
我们先来看看代码吧

#include <stdio.h>
#include <stdlib.h>

int main()
{ 
   
	FILE* pfRead = fopen("test.txt", "r");
	if (pfRead == NULL)
	{ 
   
		printf("打开文件test.txt失败啦\n");
		exit(1);
	}
	//读写文件
	//to do
	
	//关闭文件
	fclose(pfRead);
	pfRead = NULL;
	return 0;
}

因为这里fopen打开文件的方式是”r”,所以我们要保证文件存在!
那这里我们首先创建一个test.txt这样名字的文件在工程的目录下。
比如:
在这里插入图片描述
然后我们运行程序
请看结果:
在这里插入图片描述

这是为什么呢?
明明文件存在,代码也没问题!
明明文件存在,代码也没问题!
明明文件存在,代码也没问题!
怎么结果就是错了呢?
一定是今天写代码没看黄历…
在这里插入图片描述

好了,这是突然想起来,C语言还有一个报告错误信息的函数perror哦~

void perror ( const char * str );

参考文档
这个函数可以在库函数发生错误的情况下,报告当前库函数使用发生错误的原因。

这里既然我们发现fopen函数打开文件失败了,就可以在fopen函数后报告一下错误的原因是什么,接下来改代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{ 
   
	FILE* pfRead = fopen("test.txt", "r");
	if (pfRead == NULL)
	{ 
   
		//改变:这里并没有直接打印,而是换成了perror函数报告错误
		perror("打开文件test.txt失败啦");
		exit(1);
	}
	//读写文件
	//to do
	
	//关闭文件
	fclose(pfRead);
	pfRead = NULL;
	return 0;
}

请看结果:
在这里插入图片描述
程序给出的结果,让我们清醒认识到其实代码错误和黄历是没有关系的,这里和能力有关系。

当看到:”No such file or directory”这句话错误提示的时候,我们才开始怀疑,难道是真的文件不存在????难道是真的文件不存在????难道是真的文件不存在????

到这里你可能还是一筹莫展,不知如何下手?
那我就接下来揭晓答案!!!!

这个时候,我们看看创建文件的地方:
在这里插入图片描述
那如何显示文件的后缀呢?
如果你是win10系统,请看这里:
在这里插入图片描述

当我们显示文件扩展名的时候,刚刚我们创建的test.txt这个文件的名字为什么是test.txt.txt了呢?

原来是因为,当我们创建文本文件的时候,电脑自定会给文件带一个后缀是.txt,又因为我们的电脑装好系统后,默认是不显示文件的扩展名的,所以你没看到隐藏的.txt文件,这样就导致了以上的情况。

你以为你创建了一个test.txt的文件,实质上你创建了一个test.txt.txt的文件!

那我们看到这里,把文件名的后缀放展示出来,然后再把文件的名字改正确,那我们的程序就可以正常打开文件,并且读写咯。

知识点

  • fopen以读的形式打开文件,文件必须存在,代码中打开的文件名和实际文件名必须要匹配
  • perror函数是一个错误报告函数,可以适当的使用
  • 我们在使用电脑的时候,最好把文件的扩展名暴露出来,这样就不容易出问题
  • 代码出问题是不小心写了错误的代码,不是黄历的问题,要学会解决问题和调试代码的能力,才能成长为优秀的程序员。

全文完

创作不易
如果你觉得文章帮助到了你
欢迎点赞,收藏,评论,文明三连,鼓励作者
我创建了一个粉丝群:1092687209,有什么问题,欢迎交流哦

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • SQL Server——数据库创建及修改[通俗易懂]

    SQL Server——数据库创建及修改[通俗易懂]文章目录一、SQL Server数据库的相关概念1、逻辑数据库2、物理数据库二、SQL Server数据库的基本操作1、使用SQL Server Management Studio (创建/修改/删除)数据库2、使用SQL语句(创建/修改/删除)数据库【数据库文件的类型】【主要】【次要】【事务日志】文件组1.主文件组(PRIMARY)2.用户定义文件组【文件组特性】一、SQL Server数据库…

    2022年8月18日
    4
  • Enterprise Library 企业库「建议收藏」

    Enterprise Library 企业库「建议收藏」1.Enterprise Library企业库介绍    是微软模式与实践团队开的应用程序块    安装Enterprise Library      下载 www.misrosoft.com/en-us/download/details.aspx?id=15104      安装后目录结构

    2022年10月20日
    0
  • 一文教你检测MOS管好坏的五大诀窍「建议收藏」

    MOS管是金属—氧化物-半导体场效应晶体管,或者称是金属—绝缘体—半导体。MOS管因导通压降下,导通电阻小,栅极驱动不需要电流,损耗小,价格便宜等优点在电子行业深受人们的喜爱与追捧,随着电子行业飞跃式的发展,MOS管的需求量也越来越大,就在此时一批批MOS管生产厂家如雨后春笋般涌现到我们的眼前,他们的出现瞬间使得MOS管的质量的急速下滑,由于这些厂家的技术不成熟,而且当中也掺杂了许多山寨的MOS管…

    2022年4月4日
    186
  • KTT条件_kkt条件全称

    KTT条件_kkt条件全称上篇文章说了,拉格朗日乘子法,可以在等式约数的条件下,求得某函数f的极大或极小值,但是,等式约束只是不等式约束中的特例,如果我们遇到了不等式约束,该怎么办呢?本片不打算放图了,感觉完全可以接着上一篇继续搞!首先,对于等式约数,我们可以看成我们自变量可以取的点组成的几条线,也就是约束函数在某高度上的等高线。不过约束换成了不等式约束以后,此时约束就可能由“线”变成了面。但是,看上去需要考虑的取值…

    2022年10月21日
    0
  • CAS原理详解_外燃机工作原理

    CAS原理详解_外燃机工作原理CAS简介CAS的意思是compareandswap,比较并交换。CAS的引入是为了解决java锁机制带来的性能问题。锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。解决线程安全问题volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。独占锁

    2022年10月16日
    0
  • 怎么让Java输入字符串_怎么让Java获取用户输入的字符串[通俗易懂]

    怎么让Java输入字符串_怎么让Java获取用户输入的字符串[通俗易懂]从控制台动态输入数据,对数据进行各种各样的处理,然后将数据输出是很常见的操作。现在对数据的输入方式进行系统的介绍:Scanner类的调用相关方法:hasNext()判断扫描器中当前扫描位置后是否还存在下一段。hasNextLine()如果在此扫描器的输入中存在另一行,则返回true。next()查找并返回来自此扫描器的下一个完整标记。nextLine()此扫描器执行当前行,并返回跳过的输入信息。…

    2022年7月7日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号