c语言IO

前言

老是忘记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;  
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMS Full GC流程以及调优配置

个人博客 CMS Full GC流程以及调优配置 | iwts’s blog CMS CMS 收集器是以实现最短 STW 时间为目标的收集器&#xff0c;所以对于偏业务的后台开发而言&#xff0c;基本上都无脑选CMS了。 多线程收集器&#xff0c;工作在老年代&#xff0c;采用标记清除算法。比较特殊&am…

leetcode-顺时针旋转矩阵-111

题目要求 思路 1.假设现在有一个矩阵 123 456 789 2.我们可以根据19这个对角线将数据进行交换&#xff0c;得到矩阵 147 258 369 3.然后将矩阵每一行的数据再翻转&#xff0c;得到矩阵 741 852 963 代码实现 class Solution { public:vector<vector<int> > rot…

贪心-ACW803区间合并-XMUOJ力量碎片合并

题目 思路 附上几个参考链接 for(auto i : v)遍历容器元素_for auto 遍历-CSDN博客 C pair的基本用法总结&#xff08;整理&#xff09;_c pair用法-CSDN博客 使用 sort 实现自定义排序 - AcWing 话不多说&#xff0c;直接上代码 代码 /* ACW803区间合并-XMUOJ力量碎片合…

【C++】二分查找算法:x的平方根

1.题目 2.算法思路 看到题目可能不容易想到二分查找。 这题考察我们对算法的熟练程度。 二分查找的特点&#xff1a;数组具有二段性(不一定有序)。 题目中没有数组&#xff0c;我们可以造一个从0到x的数组&#xff0c;然后利用二分查找找到对应的值即可。 3.代码 class S…

Android 布局中@NULL的使用和代码实现方式详解

文章目录 1、使用场景2、示例代码实现2.1、移除背景2.2 、移除文本2.3、移除布局宽度或高度2.4、移除提示文本2.5、移除图像资源 3、综合示例3.1、布局文件 activity_main.xml3.2、主活动文件 MainActivity.java3.4、资源文件3.5、运行结果 4、优点5、缺点6、综合分析6.1、适用…

MySQL数据库基础:使用、架构、SQL语句、存储引擎

文章目录 什么是数据库CS模式 基本使用安装链接服务器服务器、数据库、表关系简单使用数据库在Linux下的体现 MySQL架构连接器层客户端层服务层存储引擎层物理存储层 SQL分类存储引擎 什么是数据库 mysql&#xff1a;数据库服务的客户端mysqld&#xff1a;数据库服务的服务器端…

BGP策略实验(路径属性和选路规则)

要求&#xff1a; 1、使用preval策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4通过R3到达192.168.12.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2到达19…

移动云以深度融合之服务,令“大”智慧贯穿云端

移动云助力大模型&#xff0c;开拓创新领未来。 云计算——AI模型的推动器。 当前人工智能技术发展的现状和趋势&#xff0c;以及中国在人工智能领域的发展策略和成就。确实&#xff0c;以 ChatGPT 为代表的大型语言模型在自然语言处理、文本生成、对话系统等领域取得了显著的…

深度学习中的多GPU训练(Pytorch 20)

一 多GPU训练 下面详细介绍如何从零开始并行地训练网络&#xff0c;这里需要运用小批量随机梯度下降算法。后面我还讲介绍如何使用高级API并行训练网络。 我们从一个简单的计算机视觉问题和一个稍稍过时的网络开始。这个网络有多个卷积层和汇聚层&#xff0c;最后可能 有几个…

构建智慧科技园区的系统架构:数字化驱动未来创新

随着科技的不断进步和数字化转型的加速推进&#xff0c;智慧科技园区已成为当今城市发展的重要组成部分。在智慧科技园区建设中&#xff0c;系统架构的设计和实施至关重要&#xff0c;对于提升园区管理效率、优化资源利用、促进创新发展具有重要意义。 一、智慧科技园区系统架构…

数据结构和算法|排序算法系列(三)|插入排序(三路排序函数std::sort)

首先需要你对排序算法的评价维度和一个理想排序算法应该是什么样的有一个基本的认知&#xff1a; 《Hello算法之排序算法》 主要内容来自&#xff1a;Hello算法11.4 插入排序 插入排序的整个过程与手动整理一副牌非常相似。 我们在未排序区间选择一个基准元素&#xff0c;将…

中国人工智能大模型价格战

近年来&#xff0c;人工智能技术迅猛发展&#xff0c;尤其是大模型领域的突破让人们看到了更多的可能性。然而&#xff0c;在这一高科技领域&#xff0c;中美两国的竞争日趋激烈。近日&#xff0c;中国互联网巨头们纷纷启动大模型价格战&#xff0c;引发了广泛关注。这场价格战…

GpuMall智算云:meta-llama/llama3/Llama3-8B-Instruct-WebUI

LLaMA 模型的第三代&#xff0c;是 LLaMA 2 的一个更大和更强的版本。LLaMA 3 拥有 35 亿个参数&#xff0c;训练在更大的文本数据集上GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 Llama 3 的推出标志着 Meta 基于 Llama 2 架构推出了四个新…

解决word里加入mathtype公式后行间距变大

1.布局>页面设置>文档网格&#xff0c;网格栏选为无网格 2.固定间距

CentOS Stream 9 vsftpd本地用户设置

1、使用yum指令下载vsftpd yum install vsftpd2、创建wu用户&#xff0c;为ftp组的成员 useradd -g ftp wu3、设置一个密码 echo 1 |passwd --stdin wu4、修改本地用户目录的权限&#xff08;所有者为wu用户&#xff09; chown -R wu /data/wu5、创建本地用户的信息数据存放…

领导VS管理:技术团队掌舵者的双重角色解析

文章目录 引言一、管理1.1 管理的定义1.2 管理的特点1.3 管理的作用 二、领导2.1 领导的定义2.2 领导的特点2.3 领导的作用 三、管理与领导的互补性3.1 互补策略 总结 引言 在科技飞速发展的今天&#xff0c;技术团队作为推动企业创新的核心力量&#xff0c;其管理显得尤为关键…

Quartus Cyclone I II III IVE 器件型号

玩耍了一个 EP2 型号的开发板&#xff0c;发现 安装的quartus13 没有Cyclone II 型号&#xff0c;经过探索发现了是版本不对。 https://www.intel.com/content/www/us/en/software-kit/711920/intel-quartus-ii-subscription-edition-design-software-version-13-0sp1-for-win…

3、xss-labs之lecel3

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

aws eks中amazonlinux2023版本节点加入集群逻辑变更的测试

基于amazonlinux2023的EKS优化AMI相关更新如下 引入yaml文件进行节点的初始化配置 需要VPC CNI v1.16.2及以上版本 可配置实例存储将自动挂载为 raid0 需要IMDSv2 使用cgroupv2 从userdata到nodeadm AL2中节点需要通过bootstrap.sh脚本执行节点的初始化逻辑&#xff0c;…

【学习笔记】Windows GDI绘图(七)图形路径GraphicsPath详解(下)

文章目录 前三篇回顾GraphicsPath方法Flatten压平(将曲线转成线段)GetBounds获取外接矩形GetLastPoint获取路径最后一个点IsOutlineVisibleIsVisiable是否在轮廓上或内部Reset重置Reverse逆转点的顺序Transform矩阵变换Wrap扭曲变换Widen将路径替换为指定画笔的填充区域 前三篇…