打开一个只读文件,如果文件不存在,则去创建这个文件,通过异常去完成

本文提供了一个Python代码示例,展示了如何使用try-except-else-finally结构来处理文件的打开、读取及异常情况。如果文件存在则直接打开并读取内容,若不存在则创建新文件。

直接上代码:

try:
    filename = input("请输入要打开的文件名:")
    f = open(filename, 'r')   #有这个文件,则打开
    print("文件的内容是:")
    for i in f:
        print(i)
except Exception as e:
    print("文件发生错误啦", e)
    f = open(filename, 'w')   #没有这个文件,则新建
else:
    print("没有异常,我会执行")
finally:
    print("无论有没有异常,我都会执行")
    f.close()

有这个文件,则打开:

没有这个文件,则新建:

 

 

<think>我们正在讨论fopen函数在文件存在时的行为。根据引用[1]和引用[2],fopen函数在文件存在时的行为取决于打开文件的模式(mode参数)。引用[1]中提到:以只读方式("r")打开文件时,文件必须存在,否则会返回NULL,创建文件。引用[2]中提到:fopen函数会返回NULL如果要打开文件存在(注意这里没有说明模式,所以需要具体分析模式)。引用[3]中提到了标准文件(标准输入、标准输出、标准错误输出)的概念,但未直接回答文件存在时的行为。实际上,C标准规定:当使用以下模式时,如果文件存在,会创建文件:-"w":写模式,打开用于写入(如果文件存在则截断文件存在创建)-"a":追加模式,打开用于追加(文件存在创建)-"w+":写读模式,打开用于读写(文件存在则截断,存在创建)-"a+":追加读模式,打开用于读写(文件存在创建存在则追加)当使用以下模式时,文件必须存在,否则返回NULL:-"r":只读模式-"r+":读写模式因此,回答用户的问题:fopen函数在文件存在时是否会创建文件,取决于所使用的模式。我们总结如下:-使用"w","a","w+","a+"模式时,如果文件存在,则会创建文件。-使用"r","r+"模式时,如果文件存在,则创建文件,而是返回NULL。示例代码(验证"w"模式创建文件):```c#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;//尝试以写模式打开一个存在文件fp=fopen("D:\\newfile.txt","w");if(fp==NULL){printf("Failedtoopenthefile.\n");exit(EXIT_FAILURE);}else{printf("Fileopenedsuccessfully.\n");fclose(fp);}return0;}```上述代码中,如果D盘下没有newfile.txt,则会创建文件(如果权限允许)。如果创建成功,fopen会返回NULL。注意事项:创建文件还需要有相应的目录权限,如果目录允许写入,那么即使模式正确,也会失败。因此,用户在使用fopen时,应根据需求选择合适的模式,并检查返回值以确保文件操作成功。相关问题:1.如何在C语言中安全地创建文件并写入数据?2.使用"w"模式打开存在文件会造成什么影响?3.如何判断fopen失败的原因(例如文件存在还是权限足)?4.文件权限如何影响fopen创建行为?</think> ### C语言 `fopen()` 在文件存在时的行为分析 `fopen()` 函数在文件存在时**是否创建文件,完全取决于打开模式参数(`mode`)**,以下是核心规则总结: | 打开模式 | 文件存在时行为 | 创建文件? | 典型应用场景 | |----------|------------------|-------------|--------------| | **`"r"`** | 直接返回 `NULL` | ❌ | 仅读取现有文件 | | **`"w"`** | **自动创建文件** | ✔️ | 新建文件或覆盖写入 | | **`"a"`** | **自动创建文件** | ✔️ | 追加写入(日志等) | | **`"r+"`** | 直接返回 `NULL` | ❌ | 读写现有文件 | | **`"w+"`** | **自动创建文件** | ✔️ | 新建文件并支持读写 | | **`"a+"`** | **自动创建文件** | ✔️ | 追加读写 | --- #### 代码验证示例 ```c #include <stdio.h> #include <stdlib.h> int main() { FILE* fp; // 模式验证:文件存在创建 fp = fopen("newfile.txt", "w"); // ✔️ 自动创建 if (fp == NULL) { perror("w模式失败"); // 仅当权限足等异常时触发 exit(EXIT_FAILURE); } fprintf(fp, "成功创建文件"); // 写入数据 fclose(fp); // 模式验证:文件存在时失败 fp = fopen("not_exist.txt", "r"); // ❌ 返回NULL if (fp == NULL) { perror("r模式错误"); // 输出:"r模式错误: No such file or directory" } return 0; } ``` --- #### 核心原理说明 1. **写入模式优先创建** 以 `w`/`a`/`w+`/`a+` 模式打开时,系统自动完成: - 检查文件是否存在 - 存在创建文件并分配文件描述符 - 返回有效 `FILE*` 指针 2. **只读模式严格校验** `r`/`r+` 模式要求文件**必须预先存在**,否则直接返回 `NULL`。此时错误代码可通过 `perror()` 或 `errno` 获取(如 `ENOENT`)[^1][^2]。 3. **特例:标准设备文件** 特殊路径(如 `stdin`/`stdout`)无需物理文件存在,它们是系统预定义流[^3]。 --- #### 文件创建失败场景 即使使用写入模式,以下情况仍会导致创建失败: 1. **路径非法**:如 `D:\\invalid?path.txt` 2. **权限足**:用户对目录无写入权限 3. **磁盘空间足**:无法分配存储空间 此时 `fopen()` 返回 `NULL`,错误类型可通过 `errno` 诊断。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值