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;  
}

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

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

相关文章

跨平台之用VisualStudio开发APK嵌入OpenCV(三)

本篇将包含以下内容&#xff1a; 1.使用 Visual Studio 2019 开发一个 Android 的 App 2.导入前篇 C 编译好的 so 动态库 3.一些入门必须的其它设置 作为入门&#xff0c;我们直接使用真机进行调试&#xff0c;一方面运行速度远高于模拟器&#xff0c;另一方面模拟器使用的…

java 拦截器-用户无操作超时退出利用Redis

1、授权过滤&#xff0c;只要实现AuthConfigAdapter接口 2、利用Redis token超时时间&#xff0c;用户访问后台续时 效果 Component public class AuthFilter implements Filter {private static Logger logger LoggerFactory.getLogger(AuthFilter.class);Autowiredprivat…

OWASP top10--SQL注入(二)

目录 06&#xff1a;SQL注入提交方式 6.1、get提交 6.2、post提交 6.3、cookie提交 6.4、HTTP Header头提交 07&#xff1a;注入攻击支持类型 7.1、union注入&#xff1a; 7.1.1、union操作符一般与order by语句配合使用 7.1.2、information_schema注入 7.2、基于函数…

在gitlab CICD中 小试 hooks:pre_get_sources_script 功能

参考链接&#xff1a; hooks:pre_get_sources_script 功能简介 hooks:pre_get_sources_script 是gitlab CICD中的一个功能&#xff0c;该功能可以指定在克隆 Git 仓库和任何子模块之前要在执行器上执行的某些命令。例如&#xff1a; 调整 Git 配置导出跟踪变量 下来简单给…

(已开源-ICRA2023) High Resolution Point Clouds from mmWave Radar

本文提出了一种用于生成高分辨率毫米波雷达点云的方法&#xff1a;RadarHD&#xff0c;端到端的神经网络&#xff0c;用于从低分辨率雷达构建类似激光雷达的点云。本文通过在大量原始雷达数据上训练 RadarHD 模型&#xff0c;同时这些雷达数据有对应配对的激光雷达点云数据。本…

<Python实际应用>用yolov9实现垃圾检测

公司一个项目需要在无人机巡检的画面中识别垃圾和汽车&#xff0c;正好听闻yolov9最新出炉&#xff0c;于是试了一下采用yolov9来搭建该项目 1.下载和部署 下载yolov9:GitHub地址&#xff1a;GitHub代码下载地址 配置环境可以参考之前关于yolov5的文章 Yolov5自学笔记之一-…

vcpkg环境配置

vcpkg 使用linux相关库&#xff0c;设置环境变量VCPKG_ROOT&#xff0c;设置cmake工具链$VCPKG_ROOT/scripts\buildsystems\vcpkg.cmake set VCPKG_DEFAULT_TRIPLETx64-windows .\vcpkg.exe install fftw3 freetype gettext glibmm gtkmm libjpeg-turbo libpng libxmlpp libs…

驱动开发之新字符设备驱动开发

1.前言 register_chrdev 和 unregister_chrdev 这两个函数是老版本驱动使用的函数&#xff0c;现在新的 字符设备驱动已经不再使用这两个函数&#xff0c;而是使用 Linux 内核推荐的新字符设备驱动 API 函数。 旧版本的接口使用&#xff0c;感兴趣可以看下面这个博客&#…

免费图片文字转换成文本,ocr文字识别软件免费版,真的太实用了!

截屏短视频上一段扎心文字&#xff0c;想把它发到朋友圈怎么办&#xff1f;这时候就需要一个OCR识别软件。 它就像一个聪明的小助手&#xff0c;它可以帮助电脑“看懂”书本上或者图片里的字。就像我们用眼睛看字一样&#xff0c;OCR软件用它的“眼睛”扫描图片&#xff0c;识…

百亿级流量红包系统,如何做架构?(字节面试真题)

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的架构类/设计类的场景题&#xff1a; 1.如何设计高并发红包系统 &#xff0…

【移动云】云端赋能——数字化时代游戏与工作的新境界

前言 在当今这个信息化、数字化的时代&#xff0c;云计算、大数据和人工智能等前沿技术已经深入到我们生活的方方面面。作为我国通信行业的领军企业&#xff0c;中国移动凭借其在5G技术领域的领先优势&#xff0c;推出了基于移动云计算技术的云业务品牌——移动云。移动云以云操…

猫抓(cat-catch)插件的常规用法

目录 1.1、前言1.2、抓取图片资源1.3、抓取音频资源1.4、抓取视频资源 1.1、前言 本文将介绍利用猫抓&#xff08;cat-catch&#xff09;插件如下抓取网页上的图片、音频、视频等资源&#xff0c;猫抓&#xff08;cat-catch&#xff09;插件的安装及设置请参考推荐一款媒体影音…

一文扫尽Nas常用Docker软件

NAS&#xff08;Network Attached Storage&#xff0c;网络附加存储&#xff09;设备上的Docker软件选择取决于您的具体需求和用途。以下是一些NAS上常用的Docker软件推荐&#xff1a; Docker管理工具&#xff1a; Watchtower&#xff1a;它可以自动更新Docker容器中的镜像&…

HILL密码

一&#xff1a;简介 Hill密码又称希尔密码是运用基本矩阵论原理的替换密码&#xff0c;属于多表代换密码的一种&#xff0c;由L e s t e r S . H i l l Lester S. HillLesterS.Hill在1929年发明。 二&#xff1a;原理 1.对于每一个字母&#xff0c;我们将其转化为对应的数字&am…

UneMeta与日本顶级IP熊本熊合作,首个NFT玩法揭秘

UneMeta 生态是一个备受加密市场以及动漫 IP 市场关注的老牌 Web3 数字资产平台&#xff0c;旨在架起现实艺术 IP 和 NFT 艺术社区之间的桥梁&#xff0c;以促进 Web3 社区的包容性和多样性。并期望基于生态一流的产品体验和平台属性&#xff0c;打造一个包容交汇的元宇宙社区。…

MDK安装

MDK安装 1 MDK的差异2 切换MDK3 安装芯片支持包注意点 1 MDK的差异 不同版本MDK有略微的差别&#xff0c;比如&#xff1a;MDK536.EXE&#xff0c;支持版本5的交叉编译链。如下图所示&#xff1a; 而MDK539.EXE不支持版本5的交叉编译链&#xff0c;所以工作的时候&#xff0c…

anaconda的安装和使用

anaconda的安装和使用 Anaconda 是一个用于科学计算和数据分析的开源发行版&#xff0c;包含了Python和R的众多包和管理工具。以下是Anaconda的安装和使用指南&#xff1a; 1. 安装Anaconda 1.1 下载Anaconda 访问 Anaconda官网 下载适用于你操作系统的Anaconda安装包。 1.2 安…

【C语言】自定义类型:联合体和枚举

1. 联合体 1.1 联合体的特点 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。 但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间所以联合体也叫&#xff1a;共⽤体。 union Un {char…

K8s的CRI机制是什么?

1. 概述 进入 K8s 的世界&#xff0c;会发现有很多方便扩展的 Interface&#xff0c;包括 CRI, CSI, CNI 等&#xff0c;将这些接口抽象出来&#xff0c;是为了更好的提供开放、扩展、规范等能力。 K8s CRI(Container Runtime Interface) 是 K8s 定义的一组与容器运行时进行交…

八种单例模式

文章目录 1.单例模式基本介绍1.介绍2.单例模式八种方式 2.饿汉式&#xff08;静态常量&#xff0c;推荐&#xff09;1.基本步骤1.构造器私有化&#xff08;防止new&#xff09;2.类的内部创建对象3.向外暴露一个静态的公共方法 2.代码实现3.优缺点分析 3.饿汉式&#xff08;静态…