首页 > 其他分享 >C中的open(), write(), close(), fopen()

C中的open(), write(), close(), fopen()

时间:2024-10-26 08:53:07浏览次数:5  
标签:文件 include write fd close fopen open

open() 函数

原型

#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:文件权限,通常在创建文件时使用。它是一个八进制值(例如 0666),表示文件的读写权限(关于0666的解释请看这篇博客Linux中文件的权限)。

返回值

  • 如果成功,返回一个非负整数(文件描述符),可以用来进行后续的读写操作。

  • 如果失败,返回 -1,并且可以通过 errno(是一个全局变量,定义在<errno.h>头文件中,这篇博客有涉及到) 获取错误信息。

错误处理

常见的错误包括:

  • EACCES:权限被拒绝。

  • ENOENT:文件不存在。

  • EEXIST:试图创建一个已存在的文件(当使用 O_CREAT 时)。

举一个例子

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

int main() {
    int fd = open("example.txt", O_RDWR, 0666);
    if (fd == -1) {
        perror("Error opening file");
        close(fd);
        return 1;
    }
    
    // 使用文件描述符 fd 进行读写操作...

    close(fd); // 关闭文件
    return 0;
}

输出如下:

img

write()函数

原型

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • fd:要写入的文件描述符,通常是 open() 返回的值。

  • buf:指向要写入的数据的指针。

  • count:要写入的字节数。

返回值

  • 如果成功,返回实际写入的字节数。

  • 如果失败,返回 -1,并且可以通过 errno 获取错误信息。

错误处理

常见的错误包括:

  • EFAULT:buf 指针无效。

  • EBADF:文件描述符无效。

  • EIO:I/O 错误。

举一个例子

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

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (fd == -1) {
        perror("Error opening file");
        close(fd);
        return 1;
    }
    
    const char *data = "Hello, World!\n";
    ssize_t bytes_written = write(fd, data, 14);
    if (bytes_written == -1) {
        perror("Error writing to file");
        close(fd);
        return 1;
    }

    printf("Wrote %zd bytes to file.\n", bytes_written);

    close(fd); // 关闭文件
    return 0;
}

输出如下:

img

close()函数

close() 函数用于关闭一个已打开的文件描述符。在 C/C++ 编程中,关闭文件描述符是一个重要的步骤,以确保资源被正确释放。

原型

#include <unistd.h>

int close(int fd);
  • fd:要关闭的文件描述符,通常是之前通过 open()socket()pipe() 等函数获取的值。

返回值

  • 如果成功,close() 返回 0。

  • 如果失败,返回 -1,并且可以通过 errno 获取错误信息。

工作原理

  • 释放资源:关闭文件描述符后,操作系统会释放与该文件描述符相关的所有资源。这包括文件的缓冲区、文件锁和其他相关信息。

  • 防止资源泄漏:如果不调用 close(),程序在结束时可能会造成资源泄漏,因为操作系统可能会保留这些资源,直到程序终止。

  • 同步数据:在某些情况下,关闭文件描述符会导致缓冲区中的数据被强制写入磁盘。对于写入模式打开的文件,关闭操作可能会确保所有待写入的数据都已被写入。

错误处理

常见的错误包括:

  • EBADF:文件描述符无效或未打开。

  • EIO:发生 I/O 错误。

举一个例子

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

int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0666);
    if (fd == -1) {
        perror("Error opening file");
        return 1;
    }

    // 执行写操作...

    if (close(fd) == -1) {
        perror("Error closing file");
        return 1;
    }

    printf("File closed successfully.\n");
    return 0;
}

输出如下:

img

fopen()函数

fopen() 是 C 标准库中的一个函数,用于打开一个文件并返回一个文件指针,以便后续进行读写操作。它通常在 <stdio.h> 头文件中声明。

原型

FILE *fopen(const char *filename, const char *mode);
  • filename:要打开的文件的名称(字符串)。

  • mode:打开文件的模式,指示将如何访问该文件。常用的模式包括:

    • "r":只读模式,文件必须存在。

    • "w":只写模式,若文件存在则清空内容,不存在则创建新文件。

    • "a":附加模式,数据会被写入到文件末尾。

    • "r+":读写模式,文件必须存在。

    • "w+":读写模式,若文件存在则清空内容,不存在则创建新文件。

    • "a+":附加读写模式,可以读文件内容,写入数据到文件末尾。

返回值

  • 返回一个指向 FILE 结构的指针,表示打开的文件。

  • 如果打开失败,返回 NULL,并且可以通过 errno 获取错误信息。

举一个例子

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r"); // 尝试以只读模式打开文件
    if (file == NULL) {
        perror("Error opening file"); // 打印错误信息
        fclose(file); // 关闭文件
        return 1;
    }

    // 进行文件操作...

    fclose(file); // 关闭文件
    return 0;
}

输出如下:

img

重要注意事项

  • 错误检查:在使用 fopen() 后,始终检查返回值,以确保文件成功打开。

  • 关闭文件:使用 fclose() 函数关闭打开的文件,以释放系统资源。

fopen()和open()有什么不同

fopen() 更适合一般的文件处理需求,提供了较高的抽象层次,而 open() 则适合需要低级文件控制的情况。

  1. 语言和库

    fopen()

     - 是 C 标准库中的函数,通常用于 C 和 C++ 编程。
    
     - 提供更高层次的文件操作接口。
    

    open()

     - 是 POSIX 系统调用,主要用于 C 语言(也可用于C++),适用于 UNIX/Linux 系统。
    
     - 提供低级别的文件操作。
    
  2. 返回值

    fopen()

    • 返回一个指向 FILE 结构的指针,用于后续的文件操作。

    • 如果打开失败,返回 NULL。

    open()

    • 返回一个文件描述符(非负整数),用于标识打开的文件。

    • 如果打开失败,返回 -1,并且可以通过 errno 检查错误。

  3. 文件模式

    fopen()

    • 使用字符串来指定打开模式(如 "r"、"w"、"a" 等)。

    • 提供更方便的读写功能。

    open()

    • 使用整数标志来指定打开模式(如 O_RDONLY、O_WRONLY、O_RDWR 等)。

    • 适合底层文件操作,允许更多的细粒度控制。

  4. 错误处理

    fopen()

    • 错误处理通常依赖于返回值(检查指针是否为 NULL)。

    open()

    • 需要检查返回值并结合 errno 获取具体错误信息。
  5. 文件操作

    fopen()

    • 提供了 freadfwritefprintffscanf 等高级文件操作函数,适合格式化输入输出。

    open()

    • 主要与 read()write()lseek()close() 等系统调用一起使用,适合底层的文件操作。

标签:文件,include,write,fd,close,fopen,open
From: https://www.cnblogs.com/hisun9/p/18503564

相关文章

  • DDR Study - LPDDR Write and Training
    参考来源:JESD209-4B,JESD209-4ELPDDRInitial→LPDDRWriteLevelingandDQTraining→LPDDRReadandTraining→LPDDRWriteandTraining→LPDDRClockSwitch→PIMTechnicalWriteCommand基于JEDEC标准中可以看到WriteTiming信息如下:图中的相关参数信......
  • Termux的ssh连接不上,Connection to 192.168.1.5 closed by remote host.(半解决)
    背景拿另一个旧手机玩termux,但是意外地发现ssh连不上,起初以为是我操作有问题,配置不当,因为新版的openssh我不是很了解。客户端显示如下:PSC:\Users\acer>[email protected][email protected]'spassword:Connectionto192.168.1.5closedbyremotehost.C......
  • 2024Ciscn总决赛Web Writeup
    前言鸽了三个月的复现计划:)ezjs考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码constexpress=require('express');constejs=require('ejs')constsession=require('express-session');constbodyParse=require('body-parser');co......
  • 0xgame Re wk1 writeup
    Oct6下午刚到北京的我又来水了0xgameRewk1writeupBabyBaseIDAPro打开,找到encode方法,裸的base64。BinaryMaster这标题以为是在暗示二进制,结果跟二进制一点关系都没有。运行程序,将八进制转化为十六进制数并输入即可获得flag,也可以直接用IDAPro打开来找。盐豆不带盐的......
  • 0xgame re wk2 writeup
    0xgamerewk2wpFirstSight-Pyc直接在线反编译。#!/usr/bin/envpython#visithttps://tool.lu/pyc/formoreinformation#Version:Python3.8importhashlibuser_input=input('请输入神秘代号:')ifuser_input!='Ciallo~':print('代号不是这个哦&#......
  • [Javascript] Write memoize function
    classMemoizeMap{constructor(){this._map=newMap();this._weakMap=newWeakMap();}_isObject(v){returntypeofv==="object"&&v!==null;}set(key,value){if(this._isObject(key)){this._......
  • document.write() 与 换行的问题(“\r”)不适用 解决办法
    代码:打印n行五角星 <script>      //打印n行n列的输入法☆      varn=prompt("请输入行数");      for(vari=0;i<n;i++){        for(varj=0;j<n;j++){            ......
  • 2024 强网拟态Writeups
    ez_re直接各种调试/Trace。输入长度是0x38,输入经过三次变换,第一次为+0x40(其中存在反调试使用x64dbg隐藏PEB即可)第二轮Trace结果是这样,看起来很复杂,其实就是三个xor的定义式,0xE9FCF789^0xB62DD00^0xE29E2AF6=0x7f,就是xor0x7f第三轮是一个XTEA每一步多了个x......
  • abort与close有哪些区别
    abort与close的区别是:1、功能不同;2、用法不同;3、影响范围不同;4、错误处理不同。abort函数用于终止程序的执行,一旦调用该函数,程序会立即停止并退出。而close函数用于关闭打开的文件,关闭后该文件不能再被访问或操作。一、abort与close的区别在计算机编程中,abort和close都是用来......
  • GDPC-CSA::CTF一轮web题目write up-T2 ez http
    首先来看题目先不鸟提示,进去页面逛逛,F12一下,看到如下内容回头来看提示,robots.txt是网页用来告知爬虫允许和禁止访问文件的君子协议,由题我们决定先打开/robots.txt查看一下爬虫被禁止访问哪些文件,其中说不定会有线索如果对robots.txt还不了解的可以看看这里在网站地址框输入......