【Linux系统编程】02:文件操作

news2024/12/27 13:07:23

文件IO


  • 系统调用(不带缓冲的IO操作)
  • 库函数(默认带用户缓冲的IO操作)

一、非缓冲IO

  • 系统调用:即为不带缓冲的IO

1.打开文件open

在这里插入图片描述

在这里插入图片描述

2.读取文件read

NAME
       read - read from a file descriptor
    
SYNOPSIS
       #include <unistd.h>
       ssize_t read(int fd, void *buf, size_t count);

DESCRIPTION
       read() attempts to read up to count bytes from file descriptor fd into the buffer starting at buf.

       On  files that support seeking, the read operation commences at the file offset, and the file offset is incremented by 	        the number of bytes read.  If the file offset is at or past the end of file, no bytes are read, and read() returns zero.

       If count is zero, read() may detect the errors described below.  In the absence of any errors, or if read() does not            check for errors, a read() with a count of 0 returns zero and has no other effects.

       According to POSIX.1, if count is greater than SSIZE_MAX, the result is implementation-defined; see NOTES for the upper          limit on Linux.
           
RETURN VALUE
       On success, the number of bytes read is returned (zero indicates end of file), and the file position is advanced by this        number.  It is not an error if this number is smaller  than  the  number  of  bytes requested;  this  may  happen  for          example because fewer bytes are actually available right now (maybe because we were close to end-of-file, or because we          are reading from a pipe, or from a terminal), or because read() was interrupted by a signal.  See also NOTES.

       On error, -1 is returned, and errno is set appropriately.  In this case, it is left unspecified whether the file position        (if any) changes.
  • fd:文件描述符
  • buf:一块内存的首地址,用于存放读取的数据
  • count:读取的字节数
  • 返回值:读取到的字节数,0表示文件读取结束

3.写入文件write

在这里插入图片描述

4.关闭文件close

在这里插入图片描述

5.创建文件create

在这里插入图片描述

二、案例使用

1.文件读操作

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>

int main(int argc, char *argv[]) {
    int fd;
    if (argc < 2) {
        fprintf(stderr, "Usage : %s file\n", argv[0]);
        exit(1);
    }
    if ((fd = open(argv[1], O_RDONLY)) == -1) {
        perror("open");
        fprintf(stderr, "%d\n", errno);
        exit(1);
    }
    while (1) {
        char buff[512] = {0};//buff用于存放读出内容
        ssize_t num;
        if ((num = read(fd, buff, sizeof(buff))) > 0) {//0表示读到文件末尾 -1表示出错
            printf("%s", buff);
        } else {
            break;
        }
    }
    close(fd);
    return 0;
}

在这里插入图片描述

由于文件较大char buff[512]字节无法一次性读完,两次buff读的中间出现会一些特殊的符号(数组的结束位置\0被覆盖)。

为了解决上述问题,可以通过临时将buff[]数组的最后一个元素赋值为\0将其结束,从而解决buff[]数组后一个位置被覆盖的问题(有可能越界赋值)。

在这里插入图片描述

2.文件拷贝操作

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#include<unistd.h>

int main(int argc, char *argv[]) {
    int fd1, fd2;
    if (argc < 3) {
        fprintf(stderr, "Usage : %s file1 file2\n", argv[0]);
        exit(1);
    }
    if ((fd1 = open(argv[1], O_RDONLY)) == -1) {
        perror("open1");
        fprintf(stderr, "%d\n", errno);
        exit(1);
    }
    if ((fd2 = open(argv[2], O_RDWR | O_CREAT, 0660)) == -1) {
        perror("open2");
        fprintf(stderr, "%d\n", errno);
        exit(1);
    }
    //文件拷贝操作
    while (1) {
        char buff[512] = {0};//buff用于存放读出内容
        buff[512] = '\0';
        ssize_t num1;
        ssize_t num2;
        if ((num1 = read(fd1, buff, sizeof(buff))) > 0) {//0表示读到文件末尾 -1表示出错
            //将读出的文件buff写入目标文件, 如果写入失败则直接退出循环
            if ((num2 = write(fd2, buff, num1)) < 0) break;
        } else {
            break;
        }
    }
    close(fd1);
    close(fd2);
    return 0;
}

在这里插入图片描述

文件拷贝成功。

三、缓冲IO

  • 库函数:即为默认带用户缓冲的IO操作(标准IO/用户缓冲IO)

1.打开文件fopen

在这里插入图片描述

2.读取文件fread

在这里插入图片描述

3.写入文件fwrite

在这里插入图片描述

4.关闭文件fclose

在这里插入图片描述

四、案例使用

1.文件拷贝

#include "head.h"

int main(int argc, char *argv[]) {
	int opt;
	char rname[50] = {50}, wname[50] = {0};
	FILE *r, *w;
	//文件打开
	while ((opt = getopt(argc, argv, "r:w:")) != -1) {
		switch (opt) {
			case 'r' :
				strcpy(rname, optarg);
				break;
			case 'w' :
				strcpy(wname, optarg);
				break;
			default:
				fprintf(stderr, "Usage : %s -r file1 -w file2\n", argv[0]);
				break;
		}
	}
	if (!strlen(rname) || !strlen(wname)) {//判定 -r -w的参数是否为空
		fprintf(stderr, "Usage : %s -r file1 -w file2\n", argv[0]);
		exit(1);
	}
	if ((r = fopen(rname, "r")) == NULL) {//判定以r形式的文件是否打开成功
		perror("fopen1");
		exit(1);
	}
	if ((w = fopen(wname, "w")) == NULL) {//判定以w形式的文件是否打开成功
		perror("fopen2");
		exit(1);
	}
	//文件读取 写入
	ssize_t num;
	while (1) {
		char buff[1024] = {0};
		if ((num = fread(buff, 1, sizeof(buff), r)) > 0) {
			fwrite(buff, 1, num, w);
		} else {
			break;
		}
	}
	fclose(r);
	fclose(w);
	return 0;
}

在这里插入图片描述

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

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

相关文章

Spring Boot HTTP 400排查

背景 前段时间朋友咨询他们公司某个HTTP接口偶现400错误&#xff0c;有没有什么好的分析方法和解决方案&#xff0c;使用的是Spring Cloud体系。最近有时间总结下这个问题的处理过程。 为了分析问题&#xff0c;笔者使用 Spring Boot 3.0.2还原报错场景进行讲解。 问题分析 …

OM | 强化学习 + 约束规划求解组合优化问题

组合优化在航空航天、交通规划以及经济学等众多学科领域中有广泛应用&#xff0c;其目标是在有限集中寻找最优解。然而状态空间过大的问题让目前组合优化变得棘手。在过去的几年中&#xff0c;使用深度强化学习&#xff08;deep reinforcement learning&#xff0c;DRL&#xf…

SharpSCCM:一款利用SCCM实现横向渗透的强大工具

关于SharpSCCM SharpSCCM是一款功能强大的横向渗透和凭证收集工具&#xff0c;该工具主要利用了微软终端配置管理器&#xff08;SCCM&#xff09;来实现其功能&#xff0c;并能够通过访问SCCM管理终端GUI来实现横向渗透和凭证收集。 功能介绍 1、后渗透功能&#xff0c;支持横…

QT入门Input Widgets之QSlider

目录 一、界面布局功能 1、界面位置介绍 2、控件界面基本属性 2.1horizontalSlider界面属性 2.2设置步进 2.3打开或关闭滑块跟踪&#xff08;setTracking&#xff09; 二、属性功能介绍 1、常用信号 2、调用信号 3、鼠标点击QSlider滑块定在点击位置 三、Demo展示 …

2.8、调度算法的评价指标

1、CPU 利用率 由于早期的 CPU 造价极其昂贵&#xff0c; 因此人们会希望让CPU尽可能多地工作\color{red}希望让 \texttt{CPU} 尽可能多地工作希望让CPU尽可能多地工作 CPU利用率\color{red}\texttt{CPU}利用率CPU利用率&#xff1a;指 CPU “忙碌” 的时间占总时间的比例。 利…

动态规划之01背包问题和完全背包问题

01背包的问题描述&#xff1a;&#xff08;内容参考代码随想录&#xff09;有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。问题示例&#…

Echarts 设置折线图拐点的颜色,边框等样式,hover时改变颜色

第014个点击查看专栏目录上一篇文章我们讲到了如何设置拐点大小,图形类型&#xff0c;旋转角度&#xff0c;缩放同比&#xff0c;位置偏移等&#xff0c;这篇文章介绍如何设置拐点的颜色、边框大小颜色等样式。hover轴线时候&#xff0c;拐点的填充颜色改变文章目录示例效果示例…

Zookeeper安装部署

文章目录Zookeeper安装部署Zookeeper安装部署 将Zookeeper安装包解压缩&#xff0c; [rootlocalhost opt]# ll 总用量 14032 -rw-r--r--. 1 root root 12392394 10月 13 11:44 apache-zookeeper-3.6.0-bin.tar.gz drwxrwxr-x. 6 root root 4096 10月 18 01:44 redis-5.0.4 …

什么时候用MQ、MQ 的作用、延迟消息

本文主要参考沈剑大佬的消息队列系列的四篇博文和博文评论&#xff0c;以及刘海丰老师的《架构设计面试精讲》&#xff0c;文末是完整参考。 1、什么时候用MQ、MQ 的作用 MQ是一个互联网架构中常见的解耦利器。 1.1 MQ 的组成 Producer&#xff1a;消息的生产者&#xff1b; Br…

浅谈函数式编程和命令式编程的区别

一、函数式编程 ------------------------------------------------------------------------------------------------------------------------------------------ 函数式编程用一个英文单词来说的话就是“What?” 它关注结果 定义 把某个功能的具体实现&#xff0c;封装…

一文带你搞懂,Python语言运算符

Python语言支持很多种运算符&#xff0c;我们先用一个表格为大家列出这些运算符&#xff0c;然后选择一些马上就会用到的运算符为大家进行讲解。 说明&#xff1a;上面这个表格实际上是按照运算符的优先级从上到下列出了各种运算符。所谓优先级就是在一个运算的表达式中&#x…

【C语言必经之路——第12节】结构体初阶

一、结构体的声明结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体的声明struct tag{member-list;}variable-list;struct&#xff1a;是结构体定义必不可少的关键字tag&#xff1a;结构名member-list&#xff1a;成员列表(标量、…

2.16、生产者-消费者问题

系统中有一组生产者进程和一组消费者进程&#xff0c;生产者进程每次生产一个产品放入缓冲区&#xff0c;消费者进程每次从缓冲区中取出一个产品并使用。&#xff08;注:这里的“产品”理解为某种数据&#xff09; 生产者、消费者共享一个初始为空、大小为 n 的缓冲区。 只有…

Linux删除软链接

不防大家试试 unlink 命令 首先我们先来创建一个文件 #mkdir test_chk #touch test_chk/test.txt #vim test_chk/test.txt (这一步随便在这个test.txt里写点东东即可) 下面我们来创建test_chk目录 的软链接 #ln-s test_chk test_chk_ln 软链接创建好了&#xff0c;我们来…

应用安全系列之三十八:注入问题的成因以及预防原理

自从有了OWASP TOP的排名依赖&#xff0c;注入问题就一直排名前三&#xff0c;这就说明了注入问题对系统的影响是十分严重的&#xff0c;而且&#xff0c;注入问题一般比较容易被利用。注入问题产生的根本原因就是程序在接受到请求中的参数时&#xff0c;没有经过严格的验证和正…

前端工程师leetcode算法面试必备-二分搜索算法(下)索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…

如何处理“WLAN没有有效的IP配置”这一问题?

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;暂无 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的…

svg.js使用教程

在日常web开发过程中&#xff0c;我们会需要显示一些图形化的元素&#xff0c;使用divcss、ps图片是常见的实现方式。 但使用svg来绘制可能更加合适&#xff0c;SVG是可缩放矢量图形&#xff0c;有一些预定义的形状元素&#xff0c;可被开发者使用和操作&#xff1a; 矩形(rec…

图解LeetCode——剑指 Offer 50. 第一个只出现一次的字符

一、题目 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 二、示例 2.1> 示例 1: 【输入】s "abaccdeff" 【输出】b 2.2> 示例 2: 【输入】s "" 【输出】 限制&#xff1a; 0 < s 的…

Swift(5)

目录 集合类型 数组 ​编辑 合集 合集操作 字典 Where 集合类型 Swift提供了三种主要的集合类型&#xff1a;组合&#xff0c;合集&#xff0c;字典。 数组是有序的值的集合。 合集是唯一值的无序集合。 字典是无序的键值对集合。 数组 Swift数组的类型的完整写法是…