C语言文件 open函数和fopen函数

article/2025/5/11 13:37:27

open

头文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

定义函数:

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

函数说明:

参数1(pathname)
即将要打开的文件路径,例如:“a.txt”当前目录下的a.txt文件
参数2(flags)
flags分为两类:主类,副类
主类:O_RDONLY 以只读方式打开 / O_WRONLY 以只写方式打开 /O_RDWR 以可读可写方式打开
这三个是互斥的
副类:
O_CREAT 如果文件不存在则创建该文件
O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息
O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端
O_TRUNC 如果文件已经存在则删除文件中原有数据
O_APPEND 以追加的方式打开
主副可以配合使用,例如:O_RDWR|O_CREAT|O_TRUNC
在这里插入图片描述

参数3(mode)
则有下列数种组合, 只有在建立新文件时才会生效, 此外真正建文件时的权限会受到umask 值所影响, 因此该文件权限应该为 (mode-umaks).
S_IRWXU00700 权限, 代表该文件所有者具有可读、可写及可执行的权限.
S_IRUSR 或S_IREAD, 00400 权限, 代表该文件所有者具有可读取的权限.
S_IWUSR 或S_IWRITE, 00200 权限, 代表该文件所有者具有可写入的权限.
S_IXUSR 或S_IEXEC, 00100 权限, 代表该文件所有者具有可执行的权限.
S_IRWXG 00070 权限, 代表该文件用户组具有可读、可写及可执行的权限.
S_IRGRP 00040 权限, 代表该文件用户组具有可读的权限.
S_IWGRP 00020 权限, 代表该文件用户组具有可写入的权限.
S_IXGRP 00010 权限, 代表该文件用户组具有可执行的权限.
S_IRWXO 00007 权限, 代表其他用户具有可读、可写及可执行的权限.
S_IROTH 00004 权限, 代表其他用户具有可读的权限
S_IWOTH 00002 权限, 代表其他用户具有可写入的权限.
S_IXOTH 00001 权限, 代表其他用户具有可执行的权限.

返回值: 若所有欲核查的权限都通过了检查则返回0 值, 表示成功, 只要有一个权限被禁止则返回-1.

错误代码:
EEXIST 参数pathname 所指的文件已存在, 却使用了O_CREAT 和O_EXCL 旗标.
EACCESS 参数pathname 所指的文件不符合所要求测试的权限.
EROFS 欲测试写入权限的文件存在于只读文件系统内.
EFAULT 参数pathname 指针超出可存取内存空间.
EINVAL 参数mode 不正确.
ENAMETOOLONG 参数 pathname 太长.
ENOTDIR 参数pathname 不是目录.
ENOMEM 核心内存不足.
ELOOP 参数pathname 有过多符号连接问题.
EIO I/O 存取错误.

附加说明:使用 access()作用户认证方面的判断要特别小心, 例如在access()后再作open()空文件可能会造成系统安全上的问题.

write函数:

头文件:<unistd.h>
write有两种用法。一种是:ssize_t write(int fd, const void *buf, size_t nbyte);
fd:文件描述符;
buf:指定的缓冲区,即指针,指向一段内存单元;
nbyte:要写入文件指定的字节数;返回值:写入文档的字节数(成功);-1(出错)
write函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.另一种是: write(const char* str,int n)
str是字符指针或字符数组,用来存放一个字符串。n是int型数,它用来表示输出显示字符串中字符的个数。
write("string",strlen("string");表示输出字符串常量

read函数:

函数定义
ssize_t read [1]  (int fd, void *buf, size_t count);返回值
成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。参数
参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意
这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O
库时的读写位置是用户空间I/O缓冲区中的位置。比如用fgetc读一个字节,fgetc有可能从内核中预读1024
个字节到I/O缓冲区中,再返回第一个字节,这时该文件在内核中记录的读写位置是1024,而在FILE结构体中
记录的读写位置是1。注意返回值类型是ssize_t,表示有符号的size_t,这样既可以返回正的字节数、0(表
示到达文件末尾)也可以返回负值-1(表示出错)。read函数返回时,返回值说明了buf中前多少个字节是刚
读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在
读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,
下次read将返回0

read函数百度百科

范例

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
main()
{int fd, size;char s[] = "Linux Programmer!\n", buffer[80];fd = open("/tmp/temp", O_WRONLY|O_CREAT);write(fd, s, sizeof(s));close(fd);fd = open("/tmp/temp", O_RDONLY);size = read(fd, buffer, sizeof(buffer));close(fd);printf("%s", buffer);
}

执行结果:

Linux Programmer!

fopen

在这里插入图片描述
在这里插入图片描述
一、文件的打开:

FILE* fp;
// fp = fopen(文件名,使用的文件的方式);
fp = fopen("a.txt", "r");   // fp现在指向了打开的a.txt文件
if (fp == NULL)
{// 文件打开失败
}

二、文件的关闭

关闭文件的原因:
1.释放该文件占用的内存单元
2.防止往文件中写内容时文件内容写入不全,关闭文件会出发系统吧缓冲区中的数据立即写入到磁盘上
fclose(文件指针);
if (fp != NULL)
{fclose(fp);
}

三、文件的简单读写

fputc和fgetc函数
fputc():该函数把一个字符写到磁盘文件上去,一般形式为:
fputc(ch,fp); ch就是字符,如果fputc函数失败,会返回EOF,如果成功,则返回值就是写入文件的那个字符的ASCII码值
EOF —> #define EOF (-1)

fgetc():从指定文件读入一个字符
char reco = fgetc(fp);

eg:给A:\demo.txt写入字符 读字符:

FILE* fp;
fp = fopen("A:\\demo.txt","w");
if (fp == NULL)
{printf("文件打开失败\n");
}
else
{char reco = fputc('a', fp);
if (reco == EOF)
{
printf("文件写失败\n");
}reco = fputc('d', fp);fclose(fp);
}

eg:读取A:\demo.txt 刚刚写入的字符:

fp = fopen("A:\\demo.txt", "r");
if (fp == NULL)
{printf("文件打开失败\n");
}
else
{char reco = fgetc(fp);   	// 每读出一个字符,文件指针自动向下走一个字符//while (reco != EOF)   		// 是否读入的文件结束//feof(fp);         文件是否读结束,如果文件结束的话,feof(fp):返回1(真),如果文件没结束,feof(fp)返回0(假)
while(!feof(fp))        		// 文件没结束
{putchar(reco);         		// 往屏幕上输出一个字符    -- 输出:adreco = fgetc(fp);
}fclose(fp);
}

http://chatgpt.dhexx.cn/article/Qvq8qZcy.shtml

相关文章

VS中fopen_s函数的用法(fopen函数的扩展)

使用方法&#xff1a; 首先看fopen的代码&#xff1a; FILE* fp null; fp fopen(filename,"w") if(fp!null) { // 打开文件成功 }再来看fopen_s的用法&#xff1a; FILE* fp null; errno_t err 0; err fopen_s(&fp,filename,"w") if(err0) { /…

Vxworks或Workbench编译环境下fopen函数的用法

Vmware虚拟机下建立了Vxwork操作系统&#xff0c;Workbench连接对应的Vxworks操作系统进行编程&#xff0c;在此环境下进行编译c或者c语言过程中&#xff0c;用fopen或fprintf将变量输出至文件&#xff0c;过程中要注意的是&#xff0c;此时的Vxworks操作系统没有与Windows的c、…

fopen()函数的使用方法

语法&#xff1a; FILE *fopen(const char *filename, const char *mode); 返回值&#xff1a; fopen函数返回新打开文件的文件指针&#xff1b; 如果此文件不能打开&#xff0c;则返回NULL指针。 表格清晰可见&#xff1a; 模式描述文件可否存在"r"打开文件仅供…

c语言中fopen的作用,c语言fopen函数的用法

在c语言中可以使用“fopen()”函数打开一个文件&#xff0c;该函数用于打开一个文件&#xff0c;其语法是“open("file a","r");”&#xff0c;其参数r表示只读属性。 fopen函数是打开一个文件&#xff0c;其调用的一般形式为&#xff1a; 文件指针名fopen…

fopen函数的用法示例_在C和C ++中使用fopen()函数的用法以及示例

fopen函数的用法示例 In C and C++ programming languages fopen() function is used to open files and make operations like add, update, create for data. In this tutorial we will learn the syntax, usage and errors about the fopen() function. 在C和C ++编程语言中…

php fopen函数php,fopen函数介绍与使用方法详解

在我们的PHP开发中会经常遇到fopen()和file_get_contents(),相信很多同学都发现这两个函数基本上都差不多,那么我们今天就来讲讲php fopen()和file_get_contents()的区别到底再哪,废话少说了,一起来看看吧!php中读取文件可以使用fopen和file_get_contents这两个函数,二者之…

php fopen函数php,php fopen函数用法(打开创建文件)_PHP教程 - fopen

php教程 fopen函数用法(打开创建文件) 在很多时间我们都需要创建文件特别是生成静态页面的时间,我们在php中就常常会用到fopen这个函数来新建文件,它的原是是如何文件存在就追加,不存在可以创建,下面来了很多参数... php教程 fopen函数用法(打开创建文件) 在很多时间我们都…

C语言fopen函数的用法

在C语言中&#xff0c;操作文件之前必须先打开文件&#xff1b;所谓“打开文件”&#xff0c;就是让程序和文件建立连接的过程。 打开文件之后&#xff0c;程序可以得到文件的相关信息&#xff0c;例如大小、类型、权限、创建者、更新时间等。在后续读写文件的过程中&#xff0…

《java核心技术卷I》

《java核心技术卷I》java老师讲课的内容PPT代码基本是来自于这里&#xff0c;感觉还不错&#xff0c;里面的代码也是循序渐进的。 这本书本身也是老师开始讲课时推荐的或者说参考的书的第一本。

java核心技术卷1学习思维导图

java核心技术卷1学习思维导图 java核心技术卷&#xff11;学习java基础 java对象与类基础知识 面向对象java 继承 面向对象java 接口和内部类 异常、日志、断言和调试 泛型程序设计 集合

《Java 核心技术 卷1》 笔记 第六章 接口和内部类(6) 静态代理

6.5 代理 啥是代理&#xff1f;代理人就是替你办事的那个人。比如点了外卖&#xff0c;外卖小哥就是你取餐的代理人。代理除了能完成既定任务&#xff0c;还可以完成额外任务。比如&#xff0c;你留言让他给你带瓶可乐。代理类就是替一个类完成委托地另一个类。 6.5.1 静态代理…

新书推荐 | Java核心技术卷Ⅰ:基础知识(原书第11版)

新书推荐 《Java核心技术卷Ⅰ&#xff1a;基础知识&#xff08;原书第11版&#xff09;》 长按二维码了解及购买 全新第11版&#xff01;针对Java SE9、10、11全面更新&#xff01;Java领域极具影响力和价值的著作之一&#xff0c;与《Java编程思想》齐名&#xff0c;10余年全球…

【Java核心技术卷】谈谈对Java平台的理解

专题 | 谈谈对Java平台的理解 2019年4月24日下午 沉晓 学Java已经快两个月了,结果被问到 "你能给我解释一下什么是Java平台吗?" 结果支支吾吾地说了一大堆,却毫无逻辑可言,感觉超级失败 我觉得很有必要重新谈谈我对Java平台的认识,帮我理清逻辑的同时,希望能够…

对《Java核心技术卷一》读者的一些建议

思想不会变&#xff0c;所以《Java编程思想》还停留在第 4 版&#xff08;2007 年&#xff09;&#xff1b;而技术是要更新迭代的&#xff0c;所以《Java核心技术卷一》来到了第十版&#xff08;2016 年&#xff09;。 我们来看一下《Java核心技术卷一》第十版的大纲。 前九章…

Java核心技术卷1基础知识课程-专题视频课程

Java核心技术卷1基础知识课程—2人已学习 课程介绍 Java核心技术入门视频培训课程&#xff1a;该教程系统全面讲解Java语言的核心概念&#xff0c;语法&#xff0c;重要特性和开发方法&#xff0c;讲解Java开发工具跟编程思想、用Java开发具体的系统程序&#xff0c;让…

Java核心技术卷II:高级特性

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用&#xff0c;下载后请24小时内删除&#xff0c;支持正版&#xff0c;喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 内容简介 本书是Java领域有影响力和价值的著作之…

# java 核心技术卷1 (原书第11版)通读 第一章:java的基本程序设计结构

前言&#xff1a; 我是一名前端开发人员&#xff0c;因为想自学java&#xff0c;根据网络上的推荐顺序&#xff0c;决定从呼声最高的 java 核心卷 11版 读起&#xff08;PS:其实12版已经出来了&#xff0c;但是只有实体书&#xff0c;没有电子版呀。实体书太贵了&#xff0c;7…

Java核心技术卷1:基础知识(原书第10版)

本书为专业程序员解决实际问题而写&#xff0c;Java基础知识面覆盖很完整&#xff0c;可以帮助你深入了解Java语言和库。在卷I中&#xff0c;Horstmann主要强调基本语言概念和现代用户界面编程基础&#xff0c;深入介绍了从Java面向对象编程到泛型、集合、lambda表达式、Swing …

【Java核心技术卷】I/O详析

文章目录 概述Java io基本概念关于流流的分类 Java io框架一、以字节为单位的输出流的框架图&#xff08;1&#xff09;框架图图示&#xff08;2&#xff09;OutputStream详解&#xff08;3&#xff09;OutputStream子类&#xff08;4&#xff09;引申&#xff1a;打印流 二、以…