Linux高级编程 8.12 标准IO

news2024/9/20 18:47:57

目录

一、标准io

二、文件

三、man手册

四、操作文件

1.fopen

2.fputc

3.fgetc

4.fgets

5.fputs

6.fread

7.fwrite

五、命令解读

1.显示目录下的文件信息命令

2.vimdiff小工具

3.stat命令


一、标准io

IO:  input  output

I: 键盘是标准输入设备 (默认)
O: 显示器是标准输出设备 (默认)

stdio.h:标准输入输出头文件
             /usr/include/stdio.h
            <>   是系统库函数,默认路径在/usr/include/
            eg : ====>stdio.h  ===>stdio.c==>libc.so ==>/usr/lib  
            .so 动态库(或共享库)
            usr:user resource 
            ""   是用户自定义函数,默认是当前路径

二、文件

struct FILE
{
}
流:   FILE*
    数据从文件当中流入和流出所体现出来的字节流叫做流

    流的分类:
        二进制流: 二进制数据的流
        文本流:ASCII码数据的流 

命令:od -t x1 文件路径

od指的是查看文件字节命令
-t指的是以二进制数查看
x后面数字指的是以一个一个字符打印
对于太大的文件,可以加上less,减少显示内容,也就是显示文件的一部分

文本流:od -c x1 文件路径
将文本中的数据转换成字符查看
-c指的是以文本的形式查看
同样可以加less

eg:od -c status |less

三、man手册

man  man:所有man的帮助 
            man  xxx == man 1 xxx ===>查看当前xxx命令
            man 2 xxx  ===>查看xxx对应的系统调用函数
            man 3 xxx  ===》查看xxx对应的标准库函数

man 后面只能跟函数和命令,但是名字必须写对,严格匹配
man -k 模糊查找

四、操作文件

(1),打开文件  FILE 
(2),io操作,读写操作
(3),关闭文件 

1.fopen

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

mode:
        r    只读
        文件不存在报错
        文件存在则只读打开

        r+    读写
        文件不存在报错
        文件存在则读写打开

        w    只写
        文件不存在则创建
        文件存在则清0只写打开

        w+    写读
        文件不存在则创建
        文件存在则清0写读打开

        a    追加可写
        文件不存在则创建
        文件存在则追加只写打开     定位到文件最后增加内容。

        a+    追加读写
        文件不存在则创建
        文件存在则追加读写打开

返回值:
    成功返回建立的文件流指针
    失败返回NULL

2.fputc

int fputc(int c, FILE *stream);
功能:
    向流中写入一个字符
参数:
    c:要写入的字符
    stream:文件流指针
返回值:
    成功返回写入的字符ASCII码值
    失败返回EOF(end of file==-1)

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE * fp=fopen("1.txt","w");
	if(fp==NULL)
	{
		printf("fopen erro\n");
		return 1;
	}

	int ret=fputc('h',fp);
	if(ret==-1)
	{
		printf("fputs erro\n");
		return 1;
	}
	fputc('e',fp);
	fputc('l',fp);
	fputc('l',fp);
	fputc('o',fp);

	fclose(fp);
	
	return 0;
}

3.fgetc

int fgetc(FILE *stream);
功能:
    从流中读取一个字符
参数:
    stream:文件流指针
返回值:
    成功返回读到字符的ASCII码值
    读到文件末尾返回EOF
    失败返回EOF -1

利用fgetc和fputc实现复制文件操作

#include <stdio.h>

int main(int argc, const char *argv[])
{
	if(argc<3)
	{
		printf("usage:./a.out srcfile destfile\n");
		return 1;
	}

	FILE *src=fopen(argv[1],"r");
	FILE *dest=fopen(argv[2],"w");
	if(NULL==src || NULL==dest)
	{
		printf("fopen erro\n");
		return 1;
	}

	while(1)
	{
		int c=fgetc(src);
		if(EOF==c)
		{
			break;
		}
		fputc(c,dest);
	}

	fclose(src);
	fclose(dest);
	
	return 0;
}

4.fgets

char *fgets(char *s, int size, FILE *stream);
功能:从stream流对象关联的文件中获取size大小字节的文本数据
           并存储到s对应的本地内存(栈区数组,堆区内存)
参数: s 要存储数据的本地内存
       size 要获取的数据长度,单位字节。
       stream 要获取的目标文件流对象,
返回值:成功 返回指向有效数据的首地址,一般等于s的地址
        失败 或者 文件末尾 NULL;

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp=fopen("1.txt","r");
	if(fp==NULL)
	{
		printf("fopen error\n");
		return 1;
	}
	char buf[1024]={0};
	while(1)
	{
		char *s=fgets(buf,sizeof(buf),fp);
		if(NULL==s)
		{
			break;
		}
		printf("%s\n",buf);
	}
	
	return 0;
}

5.fputs

int fputs(const char *s, FILE *stream);
功能:从s所在的本地内存中获取一行数据,并写入stream对应的文件流对象。
参数: s 要写的信息,一般是固定的字符串或者有数据的数组。
           stream 要写入的目标文件流对象

返回值:成功 nonnegative number on success
        失败 -1;

#include <stdio.h>

int main(int argc, const char *argv[])
{
	FILE *fp=fopen("mao.txt","w");
	if(NULL==fp)
	{
		printf("fopen error\n");
		return 1;
	}
	char a[]="just do it";
	int ret=fputs(a,fp);
	if(ret==EOF)
	{
		printf("fputs error\n");
		return 1;
	}

	fclose(fp);
	
	return 0;
}

利用fgets和fputs实现文件复制

#include <stdio.h>

int main(int argc, const char *argv[])
{
	if(argc<3)
	{
		printf("usage: ./a.out srcfile destfile\n");
	}
	FILE *src=fopen(argv[1],"r");
	FILE *dest=fopen(argv[2],"w");
	if(src==NULL || dest==NULL)
	{
		printf("fopen error\n");
	}
	char buf[1024]={0};
	while(1)
	{
		char *s=fgets(buf,sizeof(buf),src);
		if(NULL==s)
		{
			break;
		}
		fputs(buf,dest);
	}

	fclose(src);
	fclose(dest);
	return 0;
}

6.fread

size_t  fread(void  *ptr,  size_t size, size_t nmemb, FILE *stream);
功能:从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr
          所在的本地内存中。
参数:ptr 要存储数据的本地内存一般是数组或者结构体指针
      size 单个数据块的元数据大小。最小单元的大小
      nmemb 要获取的数据块的个数,拷贝的数据块个数。
      stream 要获取数据的源文件流对象,如果是stdin表示从
      键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:成功 小于等于nemeb的整数,表示获取的数据长度
        失败 小于0,结尾 0;

#include <stdio.h>
#include <string.h>

typedef struct 
{
    char name[50];
    int age;
    char phone[15];
}PER;

int main(int argc, const char *argv[])
{
	FILE *fp=fopen("1.txt","r");
	if(fp==NULL)
	{
		printf("fopen error\n");
	}
	PER per;
	bzero(&per,sizeof(per));
	size_t ret=fread(&per,sizeof(per),1,fp);
	printf("name:%s age:%d phone:%s\n",per.name,per.age,per.phone);
	if(ret!=1)
	{
		printf("fread error\n");
		return 1;
	}
	fclose(fp);

	return 0;

}

局部变量初始化:
在定义局部变量之后如果不进行初始化,其内部空间的数据是混乱且随机的。
我们有三种方法处理:

(1).初始化:
buf[1024] ={0};

(2).memset函数
将空间按预定值填充
memset(void *p,int c,size_t size);
其中
void*p指的是所要清空空间的地址
int c指的是填充清空空间的目标数
size_t 指的是要清空多少个空间


(3).bzero(void* P,size_t size).
用零填充空间,以二进制形式清零

7.fwrite

size_t fwrite(const void  *ptr,  size_t  size,size_t nmemb, FILE *stream);
功能:从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应
     的文件流对象中。
参数:ptr 要写的数据块地址,一般是数组或者结构体指针
      size  要写的数据块元数据大小,单位是字节
      nmemb 要写的数据块的个数
      stream 要写的目标文件流对象。如果是stdout则表示数据会
      写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。

返回值:成功 小于等于nmemb 的个数。
        失败 <0

#include <stdio.h>
#include <string.h>

struct person 
{
    char name[50];
    int age;
    char phone[15];
};

int main(int argc, const char *argv[])
{
	FILE *fp=fopen("1.txt","w");
	if(NULL==fp)
	{
		printf("fopen error\n");
	}
	struct person s={"zhangsan",20,"13425678576"};

	size_t ret=fwrite(&s,sizeof(s),1,fp);
	if(ret !=1)
	{
		printf("fwrite error\n");
		return 1;
	}

	fclose(fp);
	return 0;
}

五、命令解读

1.显示目录下的文件信息命令

-rw-rw-r-- 1 linux linux   72    8月  12 16:24 1.txt

将上述分开解读

 -      rw-       rw-         r--

前面第一个字符含义:

        -  代表着普通文件 

        d  代表目录

        c 代表字符设备

        b 代表块设备

        l 软连接(符号链接)

        p 管道文件-----系统用内存虚拟出的文件

        s 套接字文件

r  w  x

r代表读,如果不能则写成-;

w代表写,如果不能则写成-;

x代表可执行,如果不能则写成-;

第一个rw- 是用户的权限;

第二个rw- 是组成员的权限;

第三个r- 是其他人的权限,一般为只读;

1代表着硬链接:两个文件名关联一个文件内容 

第一个linux是用户名,第二个是组名

72是文件大小,如果加上-lh,可以修改单位

后面的时间是以后一次修改的时间

1.txt是文件名

.是当前目录

..是上级目录(一般都有这两个)

2.vimdiff小工具

可以比较两个文件不一样的地方,其不一样的地方会通过高亮标记出来。
使用方法:
vimdiff 加文件名

3.stat命令

可以用来查看文件的详细信息。
使用方法:stat 加文件名 其可以显示文件详细的大小,时间,等等信息

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

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

相关文章

吃透张宇18讲+1000题,最后能考到110+吗?

张宇18讲太难了怎么办&#xff1f; 当然是换一本 不难的&#xff0c;张宇18讲的难度确实超过大多数同学能够接受的程度&#xff0c;张宇老师也说&#xff0c;默认大家基础已经很好&#xff0c;所以&#xff0c;如果你想很好的利用张宇18讲&#xff0c;必须要有一个一个很好的基…

ViT——探索自监督视觉Transformers在深度伪造检测中的应用

介绍 论文地址&#xff1a;https://arxiv.org/abs/2405.00355 在这篇评论文章中&#xff0c;我们研究了自监督、预训练Transformers与监督、预训练Transformers和传统神经网络&#xff08;ConvNets&#xff09;相比&#xff0c;在检测深度伪造方面的效果如何。 我们尤其关注…

开源的 P2P 跨平台传文件应用「GitHub 热点速览」

就在上周&#xff0c;发完那篇文章之后不久&#xff0c;我就有幸获得了 GitHub Models 服务公测的访问权限&#xff0c;所以就体验了一下 Playground 聊天功能。 起初&#xff0c;我以为这是“微软菩萨”降临&#xff0c;但玩了一圈下来&#xff0c;发现实际效果并没有那么惊艳…

❤️【接口测试面试】精选50接口测试面试题目,或许能帮到金九银十面试浪潮中的你❤️

基本理论知识 1、什么是(软件)接口测试? 接口测试&#xff1a;是测试系统组件间接口的一种测试方法 接口测试的重点&#xff1a;检查数据的交换&#xff0c;数据传递的正确性&#xff0c;以及接口间的逻辑依赖关系 接口测试的意义&#xff1a;在较早期开展&#xff0c;在软…

iPhone官方商店软件下载---免费看各种剧第⑤弹【iOS版包括iPad】

①点击iPhone自带软件App Store ②点击搜索&#xff0c;输入“周末趣味活动” &#xff0c;点击下载到手机 ③进入软件页面后&#xff0c;我们需要激活页面&#xff0c;点击“feedback” &#xff0c;输入“周六日”&#xff0c;点击“summit” ④等软件闪退后&#xff0c;再点…

智能化清理C盘的方法 小白也可以轻松清理C盘了 不再担心误删文件

智能化清理C盘的方法 小白用户也可以轻松清理C盘了 不再担心误删文件。对于电脑小白来说&#xff0c;C盘清理是一个大大的问题&#xff0c;因为大家都不知道C盘里有哪些文件可以删除&#xff0c;哪些不能删除&#xff0c;所以就直接的导致大家不可能去清理c盘垃圾。 就算是C盘…

一次sql请求,返回分页数据和总条数

日常搬砖&#xff0c;总少不了需要获取分页数据和总行数。 一直以来的实践是编码两次sql请求&#xff0c;分别拉分页数据和totalCount。 最近我在思考&#xff1a; 常规实践为什么不是 在一次sql请求中中执行多次sql查询或多次更新&#xff0c;显而易见的优势&#xff1a; ① 能…

opencv 控制鼠标键盘实现功能setMouseCallback

鼠标事件类型 OpenCV 支持多种鼠标事件类型&#xff0c;常见的包括&#xff1a; cv2.EVENT_LBUTTONDOWN&#xff1a;左键按下 cv2.EVENT_RBUTTONDOWN&#xff1a;右键按下 cv2.EVENT_MBUTTONDOWN&#xff1a;中键按下 cv2.EVENT_LBUTTONUP&#xff1a;左键释放 cv2.EVENT_RBUTT…

Vue3从零开始——带你轻松掌握组件的基本操作

文章目录 1. Vue 组件的基础概念1.1 什么是组件&#xff1f;1.2 组件的作用1.3 组件的分类&#xff08;全局组件 vs 局部组件&#xff09; 2. 创建和注册组件2.1 单文件组件&#xff08;SFC&#xff09;2.2 全局组件注册2.3 局部组件注册 3. 组件命名格式4. ref获取DOM元素4.1 …

CSC7225、CSC7224 双绕组24瓦芯片

CSC7225、CSC7224为高性能电流模式 PWM 开关电源控制器&#xff0c;满足绿色环保标准&#xff1b;CSC7225、CSC7224广泛适用于经济型开关电源&#xff0c;如 DVD、机顶盒、传真机、打印机、LCD 显示器等。CSC7225、CSC7224采用 DIP-8 封装。应用原理如下图&#xff1a; CSC7225…

目前最流行的前端构建工具,你知道几个?

现在的市面上有很多不同的前端构建工具&#xff0c;我们很难对它们一一进行关注。在本文中&#xff0c;我们将重点介绍最受欢迎的几种&#xff0c;并探讨开发人员喜欢或不喜欢它们的原因。 Webpack Webpack 是一个模块打包器&#xff0c;主要用于处理 Web 应用程序的资源的优化…

Kali 2024 逆向调试 GDB 13.2 安装插件 Peda 不兼容报错解决方案

发现问题 如果你尝试直接进行$ apt install gdb安装后应该是最新版的gdb 13.2。并且尝试安装peda后将会出现from six.moves import range报错 2024版的kali的python3是python3.11版本&#xff0c;而peda中的six库支持的是3.11之前的。而gdb13是支持python3.12的。 有趣的一点…

EDAS(企业级应用服务)

1 :介绍 1&#xff1a;edas 提供了应用&#xff0c;开发&#xff0c;部署&#xff0c;监控&#xff0c;运维。同时支持 spring cloud, dubbo ,HSF 2:Ali-Tomcat 基于tomcat改造的Servlet容器。支持原有功能&#xff0c;它在启动时会自动加载Pandora&#xff08;潘多拉&#x…

Java面试八股之简述消息队列P2P模型

简述消息队列P2P模型 P2P模型组件 生产者(Producer)&#xff1a;生产者是创建并发送消息的实体。它可以是一个应用程序、服务或任何产生数据的系统组件。 队列(Queue)&#xff1a;队列是存储消息的数据结构。在P2P模型中&#xff0c;队列扮演着中间存储的角色&#xff0c;负…

[二次元]个人主页搭建

文章目录 域名买一个免费的 框架HexoHexo-Theme-ParticleX Halo 参考 域名 买一个 有钱人玩这个 免费的 github.io 教程在github官方文档有&#xff1b; 框架 Hexo 静态的 Hexo-Theme-ParticleX Argvchsの小窝 Halo 动态的 halo 参考 基于Hexo框架的GitHub个人主页…

推荐一个优秀的 .NET MAUI 组件库

目录 前言 组件介绍 组件展示 布局 按钮 复选框 进度条 导航栏 组件地址 最后 前言 .NET MAUI 的发布&#xff0c;项目中可以使用这个新的跨平台 UI 框架来轻松搭建的移动和桌面应用。 为了帮助大家更快地构建美观且功能丰富的应用&#xff0c;本文将推荐一款优秀…

C语言典型例题39

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.7 求axbxc0方程的解。要求能处理任何情况下a、b、c的组合。 数学知识&#xff1a; ①当a0时&#xff0c;为一次方程bxc0&#xff1b;x-c/b&#xff1b; ②当a≠0时&#xff0c;为二次函数axbxc0。b-4c≥0时…

LeetCode 热题100-22

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

电池常用,但电芯热电耦合难?科学仿真技术轻松解决

SimLab 电池热电耦合模型 SimLab 的Battery模块&#xff0c;用于模拟电荷守恒与电池模块中的能量方程耦合。在这种方法中&#xff0c;电芯被建模为一个均匀的介质&#xff0c;可以模拟电压-电流的响应和相关热量的产生。该解决方案具有单电位&#xff08;single potential &…

创客匠人对话(上):北京惢众教育创办人揭秘如何引爆大事件发售

老蒋创客圈第63期对话标杆直播连麦&#xff0c;本期我们邀请到【惢众身心成长家园平台】王辉老师。为我们“揭秘心理疗愈赛道&#xff0c;首发GMV突破百万的方法论&#xff01;”&#xff0c;深度分享自己通过原有客源造流量&#xff0c;引爆大事件发售的核心秘籍&#xff0c;拆…