[特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用

news/2025/2/20 23:55:38/

C语言中对文件打开关闭操作

  • 前言
  • 方法一:标准输入输出库(stdio.h)—— 高级文件操作的利器
    • 打开文件
    • 💡 关闭文件:fclose
    • 示例代码
    • 📝 个人见解
  • 方法一:系统调用(fcntl.h 和 unistd.h)—— 探索底层文件操作的奥秘
    • 💡 打开文件:
    • 💡 关闭文件:fclose
    • 示例代码
    • 📝 个人见解
  • 如何选择?

前言

在C语言的世界里,文件操作是编程的基础技能之一。无论是处理文本数据、读取配置文件,还是进行复杂的文件读写操作,掌握文件的打开和关闭方法是必不可少的。今天,我将带你深入了解C语言中两种常见的文件操作方式:标准输入输出库(stdio.h) 和 系统调用(fcntl.h 和 unistd.h)。这两种方法各有特点,适用于不同的场景。让我们一起探索它们的奥秘吧!

方法一:标准输入输出库(stdio.h)—— 高级文件操作的利器

打开文件

💡 打开文件:fopen
标准输入输出库提供了fopen函数,用于打开文件。它返回一个指向FILE类型的指针,这个指针是后续文件操作的核心。
函数原型:
c
复制
FILE* fopen(const char* filename, const char* mode);
参数:
filename:文件名,可以包含路径。
mode:文件打开模式,非常灵活:
“r”:只读模式,文件必须存在。
“w”:写模式,文件不存在则创建,存在则清空。
“a”:追加模式,文件不存在则创建,写入内容追加到文件末尾。
“r+”:读写模式,文件必须存在。
“w+”:读写模式,文件不存在则创建,存在则清空。
“a+”:读写模式,文件不存在则创建,写入内容追加到文件末尾。

💡 关闭文件:fclose

文件操作完成后,一定要记得关闭文件,释放资源。fclose函数用于关闭文件。

int fclose(FILE* stream);
返回值:
成功返回0,失败返回EOF(通常是-1)。#include <stdio.h>

示例代码

int main() {
FILE* fp = fopen(“example.txt”, “r”); // 打开文件用于读取
if (fp == NULL) {
perror(“Error opening file”);
return 1;
}

// 文件操作代码...fclose(fp); // 关闭文件
return 0;

}

📝 个人见解

fopen和fclose是C语言中最常用的文件操作方式,适合处理文本文件和二进制文件。它们的优点是简单易用,功能强大,支持多种模式。如果你在开发中需要快速实现文件读写功能,标准输入输出库绝对是你的首选!

方法一:系统调用(fcntl.h 和 unistd.h)—— 探索底层文件操作的奥秘

💡 打开文件:

💡 打开文件:open
如果你对文件操作有更底层的需求,比如需要精细控制文件权限,或者直接操作文件描述符,那么系统调用open函数将是你的不二之选。
函数原型:
c
复制
#include <fcntl.h>
#include <unistd.h>

int open(const char* pathname, int flags, mode_t mode);
参数:
pathname:文件路径。
flags:文件打开标志,非常强大:
O_RDONLY:只读。
O_WRONLY:只写。
O_RDWR:读写。
O_CREAT:如果文件不存在则创建。
O_TRUNC:如果文件存在且以写模式打开,则清空文件。
O_APPEND:写入时追加内容。
mode:文件权限(仅在创建文件时使用),例如:
0644:所有者可读写,组用户和其他用户可读。

💡 关闭文件:fclose

💡 关闭文件:close
文件操作完成后,需要使用close函数关闭文件描述符。
函数原型:
c
复制
int close(int fd);
返回值:
成功返回0,失败返回-1。

示例代码

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>

int main() {
int fd = open(“example.txt”, O_RDONLY); // 打开文件用于读取
if (fd == -1) {
perror(“Error opening file”);
return 1;
}

// 文件操作代码...close(fd); // 关闭文件
return 0;

}

📝 个人见解

open和close是系统调用级别的文件操作方式,它们直接与操作系统交互,提供了更高的灵活性和性能。如果你在开发底层系统工具、驱动程序或者需要精细控制文件权限的项目,系统调用绝对是你的首选。不过,它的使用相对复杂,需要对文件描述符和权限管理有更深入的了解。

如何选择?

如果你只需要简单的文件读写操作,推荐使用标准输入输出库(fopen和fclose),因为它简单易用,功能强大。
如果你需要更底层的文件操作,比如直接控制文件描述符、管理文件权限,或者在多线程环境中进行文件操作,那么**系统调用(open和close)**将是更好的选择。


http://www.ppmy.cn/news/1572816.html

相关文章

Python学习心得字符串的去重操作

一个字符串中可能包含许多相同的元素&#xff0c;为了保证字符串中的唯一性&#xff0c;下面介绍的是字符串的去重操作&#xff1a; 第一种方式&#xff1a;利用forif的结构进行去重 这个程序是对字符串中的每个元素进行判断&#xff0c;如果不在新建的空字符串中就把该元素添…

WeMos D1+PIR+Android 的小场景制作

最近在做一个有趣的小场景功能&#xff0c;其实已经有成熟产品&#xff0c;但是考虑到没法实现场景扩展&#xff0c;所以自己开始动手做。 场景描述&#xff1a;玄关人体感应&#xff0c;有人进门&#xff0c;致欢迎词&#xff0c;有人离开&#xff0c;致欢送词。 硬件设备&a…

Ai知识点总结

图层–》后面小圈–》释放到图层顺序 illustrator&#xff1a;插画 位图&#xff1a;可以制作色彩和色调变换丰富的图像&#xff0c;容易在不同软件之间变换文件。所占容量大&#xff0c;放大、缩小、旋转会导致失真&#xff0c;无法制作真正的3D图像。 矢量图&#xff1a;所占…

C++ 设计模式-桥接模式

C桥接模式的经典示例&#xff0c;包含测试代码&#xff1a; #include <iostream> #include <string>// 实现化接口 class Device { public:virtual ~Device() default;virtual bool isEnabled() const 0;virtual void enable() 0;virtual void disable() 0;vi…

3.【线性代数】——矩阵乘法和逆矩阵

三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…

UniApp 中 margin 和 padding 属性的使用详解

margin 属性的作用与使用 margin 属性用于设置元素的外边距&#xff0c;也就是元素与其他元素之间的距离。它可以分别设置元素四个方向&#xff08;上、右、下、左&#xff09;的外边距&#xff0c;也支持使用简写形式来一次性设置多个方向的外边距。 <template><view…

急停信号的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是确认设备按钮的急停…

阿里云视频点播,基于thinkphp8上传视频

前端参考官方示例(jQuery版) <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>阿里云 JavaScript上传SDK Demo (使用jquery)</title><script src"__STATIC__/jquery.min.js"></script><sc…