c语言IO

news2024/11/16 15:47:20

前言

老是忘记c语言IO操作,故写个文章记录一下

打开文件

fopen

FILE *fopen(const char *path, const char *mode);

modeimage-20240526205319442

返回值

  • 如果文件成功打开,fopen 返回一个指向 FILE 结构的指针。
  • 如果文件打开失败(例如,因为文件不存在、没有足够的权限、磁盘空间不足等),fopen 返回 NULL

使用

#include<stdio.h>
int main()
{
    FILE* new_file = fopen("file.txt", "w");
}

open

#include <fcntl.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
int open(const char *pathname, int flags, ...); //flag可以用“ | ”组合

常用的flags

  • O_RDONLY:只读方式打开文件。
  • O_WRONLY:只写方式打开文件。
  • O_RDWR:读写方式打开文件。
  • O_APPEND每次写操作都写入文件的末尾
  • O_CREAT如果指定文件不存在,则创建这个文件,指明权限
  • O_EXCL如果要创建的文件已存在,则返回-1,并且修改errno的值
  • O_TRUNC如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
  • O_NOCTTY如果路径名指向终端设备,不要把这个设备用作控制终端。 6
  • O_NONBLOCK如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O

权限

S_IRWXU, 700权限,代表该文件所有者具有可读、可写及可执行的权限。 S_IRUSR或S_IREAD, 400权限,代表该文件所有者具有可读取的权限。 S_IWUSR或S_IWRITE, 200权限,代表该文件所有者具有可写入的权限。 S_IXUSR或S_IEXEC, 100权限,代表该文件所有者具有可执行的权限。

S_IRWXG, 070权限,代表该文件用户组具有可读、可写及可执行的权限。 S_IRGRP, 040权限,代表该文件用户组具有可读的权限。

S_IWGRP, 020权限,代表该文件用户组具有可写入的权限。

S_IXGRP, 010权限,代表该文件用户组具有可执行的权限。

S_IRWX, O07权限,代表其他用户具有可读、可写及可执行的权限。 S_IROTH, 004权限,代表其他用户具有可读的权限

S_IWOTH, 002权限,代表其他用户具有可写入的权限。

S_IXOTH, 001权限,代表其他用户具有可执行的权限。

返回值

如果成功,open 函数返回一个非负的文件描述符(file descriptor),它是一个小的非负整数,用于后续的文件操作(如 read、write、close 等)。如果失败,open 函数返回 -1,并设置全局变量 errno 以指示错误。

#include <fcntl.h>  
#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
#define BUFFER_SIZE 1024  
  
int main() 
{  
    int fd; // 文件描述符  
    char buffer[BUFFER_SIZE]; // 缓冲区  
    ssize_t bytesRead; // 读取的字节数  
  
    // 打开文件,以只读方式  
    fd = open("example.txt", O_RDONLY);  
 
    // 读取文件内容到缓冲区  
    bytesRead = read(fd, buffer, BUFFER_SIZE - 1); // 减去1以保留空间给字符串终止符  
}

读取文件

fgets

fgets 函数用于从指定的流中读取一行,并保存到字符串中。它会在遇到换行符(\n)、EOF(文件结束)或达到指定的大小限制时停止。

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
  
    char line[100];  
    while (fgets(line, sizeof(line), file)) {  
        printf("%s", line);  
    }  
  
    fclose(file);  
    return 0;  
}

fcanf

fscanf 函数用于从指定的流中读取格式化的输入。

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("numbers.txt", "r");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
  
    int num1, num2;  
    while (fscanf(file, "%d %d", &num1, &num2) == 2) {  
        printf("Read: %d and %d\n", num1, num2);  
    }  
  
    fclose(file);  
    return 0;  
}

fgetc

fgetc 函数用于从指定的流中读取一个字符

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("example.txt", "r");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
  
    int ch;  
    while ((ch = fgetc(file)) != EOF) {  
        putchar(ch);  
    }  
  
    fclose(file);  
    return 0;  
}

fread

fread 函数用于从指定的流中读取一块数据。它通常用于二进制文件的读取。

#include <stdio.h>  
  
typedef struct {  
    int id;  
    char name[50];  
} Person;  
  
int main() {  
    FILE *file = fopen("people.bin", "rb");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
  
    Person person;  
    while (fread(&person, sizeof(Person), 1, file) == 1) {  
        printf("ID: %d, Name: %s\n", person.id, person.name);  
    }  
  
    fclose(file);  
    return 0;  
}

read

ssize_t read(int fd, void *buf, size_t count);

/*
fd: 文件描述符(file descriptor),通常是一个非负整数,用于标识打开的文件或套接字。
buf: 指向一个缓冲区的指针,该缓冲区用于存储从文件中读取的数据。
count: 要读取的最大字节数。
   
返回值:
成功时,返回读取的字节数(可能小于 count)。
失败时,返回 -1 并设置 errno。*/

image-20240526211638573

#include <stdio.h>  
#include <unistd.h>  
#include <fcntl.h>  
#include <string.h>  
  
int main() {  
    int fd = open("file.txt", O_RDONLY);  
    if (fd == -1) {  
        perror("open");  
        return 1;  
    }  
  
    char buf[1024];  
    ssize_t n = read(fd, buf, sizeof(buf) - 1);  
    if (n == -1) {  
        perror("read");  
        close(fd);  
        return 1;  
    }  
  
    buf[n] = '\0'; // 添加字符串终止符  
    printf("Read %zd bytes: %s\n", n, buf);  
  
    close(fd);  
    return 0;  
}

写入文件

fputs

fputs函数用于将一个字符串写入到文件中。

int fputs(const char *str, FILE *stream);

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("output.txt", "w");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
      
    const char *str = "Hello, World!";  
    fputs(str, file);  
      
    fclose(file);  
    return 0;  
}

fprintf

fprintf函数用于将格式化的数据写入到文件中。它的使用方式与printf函数非常相似,只是多了一个文件指针参数。

int fprintf(FILE *stream, const char *format, ...);

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("output.txt", "w");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
      
    int number = 42;  
    fprintf(file, "The answer is: %d\n", number);  
      
    fclose(file);  
    return 0;  
}

fputc

fputc函数用于将一个字符写入到文件中。

int fputc(int char, FILE *stream);

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("output.txt", "w");  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
      
    char ch = 'A';  
    fputc(ch, file);  
    fputc('\n', file); // 写入换行符  
      
    fclose(file);  
    return 0;  
}

fwrite

fwrite函数用于将一块数据(可以是字符串、数组等)写入到文件中。它接收四个参数:一个指向要写入数据的指针、数据块的大小、数据块的数量以及文件指针。

size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

#include <stdio.h>  
  
int main() {  
    FILE *file = fopen("output.txt", "wb"); // 使用"wb"以二进制模式写入  
    if (file == NULL) {  
        perror("Error opening file");  
        return 1;  
    }  
      
    char str[] = "Hello, World!";  
    size_t len = sizeof(str) - 1; // 不包括字符串终止符'\0'  
    fwrite(str, sizeof(char), len, file);  
      
    fclose(file);  
    return 0;  
}

write

ssize_t write(int fd, const void *buf, size_t count);

/*
fd: 文件描述符。
buf: 指向一个包含要写入数据的缓冲区的指针。
count: 要写入的字节数。

返回值:
成功时,返回写入的字节数(可能小于 count,尤其是在非阻塞模式下)。
失败时,返回 -1 并设置 errno。*/

image-20240526211828390

#include <stdio.h>  
#include <unistd.h>  
#include <fcntl.h>  
#include <string.h>  
  
int main() {  
    int fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);  
    if (fd == -1) {  
        perror("open");  
        return 1;  
    }  
  
    const char *msg = "Hello, world!\n";  
    ssize_t n = write(fd, msg, strlen(msg));  
    if (n == -1) {  
        perror("write");  
        close(fd);  
        return 1;  
    }  
  
    printf("Wrote %zd bytes\n", n);  
  
    close(fd);  
    return 0;  
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1698826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SERVER ——查询(二)

目录 5. top 6. null 7. order by 8. 模糊查询&#xff1a; 9. 聚合函数 5. top top查询&#xff1a;查询表的前几行&#xff1b;下面是代码演示&#xff1a; --top&#xff08;前面的几个记录&#xff09; select top 2 * from emp; --查询表的前两列 select top 20 percent *…

解密论文评审过程:SCI论文是匿名送审的吗?

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 前几天有位学员问我&#xff0c;审稿人能看见我论文的作者和单位信息吗&#xff1f;应该是双方都匿名才更公平啊。 同行评议&#xff0c;在不同的期刊操作还真不一样。有双方…

python数据分析——数据可视化(图形绘制)

数据可视化&#xff08;图形绘制基础&#xff09; 前言一、图形绘制基础Matplotlib简介使用过程sin函数示例 二、常用图形绘制折线图的绘制plot示例 散点图的绘制scatter()示例 柱状图的绘制bar示例 箱型图绘制plot.box示例 饼状图的绘制pie示例 三、图形绘制的组合情况多个折线…

代码随想录|Day55|动态规划 part15|● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 class Solution: def isSubsequence(self, s: str, t: str) -> bool: dp [[0] * (len(t) 1) for _ in range(len(s) 1)] for i in range(1, len(s) 1): for j in range(1, len(t) 1): if s[i - 1] t[j - 1]: dp[i][j] dp[i - 1][j - 1] 1 else: dp[i…

3、xss-labs之lecel3

1、测试 开始页面&#xff0c;传入<script>alert(1)</script>&#xff0c;不出意外没有弹窗 2、按住CTRLU&#xff0c;查看返回的前端代码 3、看后端源码 htmlspecialchars() 是一个 PHP 函数&#xff0c;用于将特殊字符转换为 HTML 实体。比如 & &#xff08…

访问元组元素

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中&#xff0c;如果想将元组的内容输出也比较简单&#xff0c;可以直接使用print()函数即可。例如&#xff0c;要想打印上面元组中的untitle…

Java核心:注解处理器

Java提供了一个javac -processor命令支持处理标注有特定注解的类&#xff0c;来生成新的源文件&#xff0c;并对新生成的源文件重复执行。执行的命令大概是这样的: javac -XprintRounds -processor com.keyniu.anno.processor.ToStringProcessor com.keyniu.anno.processor.Po…

LeetCode热题100—链表(一)

160.相交链表 题目 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#x…

头歌结构化分析方法-数据流图

第1关&#xff1a;数据流图-画出外部实体 第2关&#xff1a;数据流图-画出加工 第3关&#xff1a;数据流图-画出数据存储 第4关&#xff1a;数据流图-画出数据流 第5关&#xff1a;数据流图-机票预定系统

奥维互动地图奥维彩色图源

彩色图源(不足&#xff0c;更精细放大) 等位线3D模式 中科星 谷歌2024(不足没以前高清)

神经网络与深度学习-简要入门

参考引用 神经网络与深度学习 1. 绪论 从根源来讲&#xff0c;深度学习是机器学习的一个分支&#xff0c;是指一类问题以及解决这类问题的方法 深度学习问题是一个机器学习问题&#xff0c;指从有限样例中通过算法总结出一般性的规律&#xff0c;并可以应用到新的未知数据上深…

vi和vim编辑器

目录 1 vi和vim的基本介绍 2 vi和vim常用的三种模式 1&#xff09;正常模式 2&#xff09;插入模式 3&#xff09;命令行模式 3 vim快捷键 1&#xff09;普通模式下&#xff1a; 2&#xff09;输入模式 3&#xff09;命令行模式 4&#xff09;可视模式 1 vi和vim的基本…

【机器学习与大模型】开源大模型和闭源大模型:技术发展与社会责任的平衡点

目录 &#x1f4a1;引言✈️✈️一&#xff0c;开源大模型的优势与劣势✈️✈️1.1 优势&#xff1a;✈️✈️1.2 挑战和劣势&#xff1a; &#x1f680;&#x1f680;2. 闭源大模型的优势与劣势&#x1f680;&#x1f680;2.1 优势&#xff1a;&#x1f680;&#x1f680;2.2 …

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点 题目链接&#xff1a; 24. 两两交换链表中的节点 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;没有正确更新头节点&#xff0c;因为head和cur共享引用&#xff0c;会随着cur的移动&#xff0c;丢失之前存放的节点 错误代码&…

6.定时器分时复用测量占空比

1.CUBEMAX配置 测量PA6&#xff0c;PA7输出的占空比&#xff0c;只需要把主要的配置&#xff0c;配置为A6口就行&#xff0c;A7口黄色表示配置不正确&#xff0c;不用管。 2.软件代码 TIME.c中找到TIM3的初始化&#xff0c;在后面初始化A7口 void MX_TIM3_Init_PA7(void) {/*…

JVM之【类加载机制】

一、类加载过程 1. 加载&#xff08;Loading&#xff09; 工作内容&#xff1a; 通过类的全限定名来获取定义此类的二进制字节流&#xff1a; JVM首先会调用类加载器的findClass方法来找到类文件的路径&#xff0c;通常从文件系统、JAR包、网络、数据库等来源获取类文件。 将…

揭秘Markdown:轻松掌握基础语法,让你的写作更高效、优雅!

文章目录 前言1.标题1.1 使用 和 - 标记一级和二级标题1.2 使用 # 号标记 2.段落格式2.1 字体2.2 分割线2.3 删除线2.4 下划线2.5 脚注 3.列表3.1 无序列表3.2 有序列表3.3 列表嵌套 4.区块4.1 区块中使用列表4.2 列表中使用区块 5.代码代码区块 6.链接7.图片8.表格9.高级技巧…

C#对文件进行批量重命名或者对某个单独的文件进行改名

目录 一、FolderBrowserDialog 二、OpenFileDialog 三、Path 四、ui设计 五、代码部分 一、FolderBrowserDialog FolderBrowserDialog是一个用于选择文件夹的对话框控件&#xff0c;可以在windows Forms应用程序中使用。使用它可以让用户选择一个文件夹&#xff0c;并返…

闲话 .NET(6):.NET Core 各个版本的特性

前言 之前我们聊了一下 .NET Core 有哪些优势&#xff0c;.NET Core 发展非常迅速&#xff0c;不过短短几年&#xff0c;.NET Core 已经发布 .NET 8 了&#xff0c;基本上保持了一年一个版本的速度&#xff0c;每个版本都有自己的独有特性&#xff0c;下面我们来简单的盘点一下…

从零实现Llama3中文版

1.前言 一个月前&#xff0c;Meta 发布了开源大模型 llama3 系列&#xff0c;在多个关键基准测试中优于业界 SOTA 模型&#xff0c;并在代码生成任务上全面领先。 此后&#xff0c;开发者们便开始了本地部署和实现&#xff0c;比如 llama3 的中文实现、llama3 的纯 NumPy 实现…