Linux系统编程 --- day1

news2024/11/26 2:34:57

目录

1. 标准IO

2. 基本操作

2.1 fopen

2.2 fgetc

2.3 fputc

2.4 fgtes

2.5 fputs

2.6 fread

2.7 fwrite

3. linux的文件


1. 标准IO

(1)标准io的概念 1975 Dennis r IO库,C语言的标准,
IO --- input  output
I: 键盘是标准输入设备 = > 默认输入就是指键盘  /dev/input
O: 显示器是标准输出设备 => 默认输出就是指显示器
Linux操作系统当中IO都是对文件的操作
任何支持标准C的系统都可使用标准IO实现文件存储
标准IO在UNIX上是对文件IO的封装
一般都是对普通文件操作是一种有缓存的IO 在文件IO和用户程序之间,加入缓冲区,可以有效减少系统调用的效率,节省系统IO调度资源。

(2)文件的概念:linux中一切都是文件。

         作用:文件用来存储数据(数据,指令);

(3)<> 和 " " 的路径

< > :是系统库函数,默认路径在 /usr/include/

" "  : 是用户自定义函数,默认当前路径。

(4)man 的使用

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

注意:如果没有命令则直接man xxx 会显示其函数,如果没有系统调用则显示系统库函数帮助

(5)文件内容的分类

文本文件和二进制文件。

(6)流(FILE *)

数据从文件当中流入和流出所体现出来的字节流叫做流。

流可分为:二进制流、二进制数据的流、文本流。

2. 基本操作

step1 : 打开文件FILE ---- fopen

step2 : io 操作,读写操作

fgetc / fputc  ---- 一个字符

fgets / fputs  ---- 一次一行

fread / fwrite ---- 自定义大小,操作二进制文件

step3 : 关闭文件  ---- fclose

2.1 fopen

功能:打开一个文件,并建立一个流

语法:FILE *fopen(const char *path, const char *mode);

path:要打开文件的路径

mode:
r  --- 只读(文件不存在报错,文件存在则只读打开)

r+  --- 读写(文件不存在报错,文件存在则读写打开)

w  --- 只写(文件不存在则创建,文件存在则清0只写打开)

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

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

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

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

2.2 fgetc

功能:从流中读取一个字符

#include <stdio.h>

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","r");          // 打开 1.txt 文件,r 代表只读
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    while(1)
    {
        int c = fgetc(fp);                  // 将读到的字符存到 c
        if(EOF == c)                        // 判断结束
        {
            break;
        }
        printf("%c\n",c);
    }
    fclose(fp);                            // 关闭文件
    return 0;
}

2.3 fputc


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

#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    int ret = fputc('h',fp);
    if(-1 == ret)
    {
        printf("fputc error\n");
        return 1;
    }
    fputc('e',fp);
    fputc('l',fp);
    fputc('l',fp);
    fputc('o',fp);

    fclose(fp);
    return 0;
}

fgetc 与 fputc 的复制:

#include <stdio.h>

int main(int argc, char *argv[])
{

    if(argc < 3)                            // 需要输入至少3个命令--- ./a.out 1 2
    {
        printf("usage:./a.out srcfile dstfile\n");
        return 1;
    }
    FILE *src = fopen(argv[1],"r");
    FILE * dst= fopen(argv[2],"w");
    if(NULL == src || NULL == dst )
    {
        printf("fopen error\n");
        return 1;
    }
    while(1)
    {
        int c = fgetc(src);
        if(EOF== c)
        {
            break;
        }
        fputc(c,dst);
    }

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

2.4 fgtes

功能:从流中读取一个字符串

#include <stdio.h>
int main(int argc, char *argv[])
{

    FILE * fp = fopen("/etc/passwd","r");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char buf[1024]={0};// 1k-4k
    while(1)
    {
        char* s = fgets(buf,sizeof(buf),fp);
        if(NULL == s)
        {
            break;
        }
        printf("%s\n",buf);
    }
    fclose(fp);
    return 0;
}

2.5 fputs

功能:向流中写入一个字符串

#include <stdio.h>

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    char data[]="hello,world";
    int ret = fputs(data,fp);
    if(EOF == ret)
    {
        printf("fputs error\n");
        return 1;
    }
    fclose(fp);
    return 0;
}

fgets 与 fputs 的复制:

#include <stdio.h>

int main(int argc, char *argv[])
{

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

2.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, char *argv[])
{

    FILE * fp = fopen("1.txt","r");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    PER per;
   // memset(&per,0,sizeof(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;
}

2.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>
typedef struct 
{
    char name[50];
    int age;
    char phone[15];
}PER;

int main(int argc, char *argv[])
{

    FILE * fp = fopen("1.txt","w");
    if(NULL == fp)
    {
        printf("fopen error\n");
        return 1;
    }
    PER per;
    strcpy(per.name ,"zhangsan");
    per.age = 20;
    strcpy(per.phone,"111222333");
    size_t ret = fwrite(&per,sizeof(per),1,fp);
    if(ret!=1)
    {
        printf("fwrite error\n");
        return 1;
    }
    fclose(fp);
    return 0;
}

3. linux的文件

(1)文件类型:有七种文件类型

d   --- 目录文件

c   --- 字符设备

b   --- 块设备

l   --- 软链接

p  --- 管道文件

s   --- 套接字

-   --- 普通文件

(2)权限  

r   --- 只读

w  --- 写

x  --- 执行

用户  组用户 其他人

chmod 改权限-

chmod 214 1.txt --- 将1.txt文件的权限改为  -w- --x r--

                                                                    (010 001 100)

注:复制其他文件夹,目标文件夹未写明路径,目标文件默认与a.out在同一路径

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

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

相关文章

当前人形机器人公司及产品介绍

产品型号属地公司名字Optimus美国特斯拉Figure02美国FigureAIAtlas美国波士顿动力通用人形Apollo美国ApptronikPhoenix加拿大Sanctuary AIRoBee意大利OversonicASIMO日本本田NAO日本软银GR-1上海傅利叶远征A1上海智元XR4上海达闼先行者K1上海开普勒青龙上海国创AstribotS1深圳星…

AIDL使用及原理介绍

一、AIDL使用及理解 介绍参考官方文档&#xff1a;https://developer.android.com/develop/background-work/services/aidl?hlzh-cn 1.1、aidl文件的产物 1.1.1 aidl文件 interface IDownloadIpc {//开始下载DownloadResponse start(in DownloadInfoParcel downloadInfo);…

【数据结构与算法】A*算法——自动寻路

这里写目录标题 一.为什么用A*算法二.A*算法的实现原理三.A*算法的实现1.初始化地图2.格子初始化3.两个列表4.起点到终点的路径5.起点到终点的最佳路径★6.资源的释放 四.完整代码1.Astar.h2.Astar.cpp3.main.cpp4.运行结果 一.为什么用A*算法 上节课我们已经讲了最短路径算法…

【Qt】内置对话框

一.Qt内置对话框 Qt 提供了多种可复⽤的对话框类型&#xff0c;即 Qt 标准对话框。Qt标准对话框全部继承于QDialog类。常⽤标准对话框如下&#xff1a; 二.内置对话框分类 1.消息对话框 QMessageBox 1.1 概念 消息对话框是应⽤程序中最常⽤的界⾯元素。消息对话框主要⽤于为…

SpringBoot集成微信小程序(二)【登录、获取头像昵称及手机号】

一、背景 小程序可以通过微信官方提供的登录能力方便地获取微信提供的用户身份标识&#xff0c;快速建立小程序内的用户体系。 微信小程序官方文档&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 二、技术栈 SpringBoot…

RFID在晶圆搬运机中的智能化实践

RFID在晶圆搬运机中的智能化实践 应用背景 在半导体制造行业&#xff0c;晶圆搬运是一个至关重要的环节&#xff0c;它不仅影响生产效率&#xff0c;还直接关系到产品的质量和成本。在如今的多品种少量生产中&#xff0c;要保障生产效率和品质&#xff0c;工序管理至关重要。…

Python环境安装及PIP安装(Mac OS版)

官网 https://www.python.org/downloads/ 安装python python-3.12.1-macos11.pkg下载后&#xff0c;安装一直下一步即可 验证是否安装成功&#xff0c;执行python3命令和pip3命令 配置环境变量 获取python3安装位置并配置在.bash_profile #查看python路径 which python3#…

卫星图像检测,分割,跟踪,超分辨率,数据集调研

卫星图像检测&#xff0c;分割&#xff0c;跟踪&#xff0c;超分辨率&#xff0c;数据集调研 超分辨率Image super-resolution: A comprehensive review, recent trends, challenges and applicationsA Review of GAN-Based Super-Resolution Reconstruction for Optical Remot…

ppt模板免费网站有哪些?自动美化工具推荐

新的8月&#xff0c;是时候以全新面貌迎接高效办公挑战了&#xff01; 想要你的PPT演示脱颖而出&#xff0c;却苦于找不到精美又免费的模板&#xff1f; 别担心&#xff0c;今天我来告诉你们&#xff1a;哪个软件有精美免费ppt模板&#xff1f; 今天我为你们精心汇总了6款PPT…

二维高斯拟合20240815

二维高斯拟合 高斯函数表达式 二维高斯函数是一个在二维空间中用来表示高斯分布的函数&#xff0c;常用于统计学、图像处理和机器学习等领域。其数学表达式通常为&#xff1a; f ( x , y ) 1 2 π σ x σ y 1 − ρ 2 exp ⁡ ( − 1 2 ( 1 − ρ 2 ) ( ( x − μ x ) 2 σ …

面向未来的算力网络连接技术架构

面向未来的算力网络连接发展特点与实践 物理层网络基础设施是算力网络的“最后一公里”&#xff0c;光纤光缆等物理层网络基础设施的发展有助于保障算力网络基础设施的稳健发展。物理层核心技术发生了巨大变化&#xff0c;在交换、传输等方面不断更新迭代&#xff0c;当前铜缆的…

【云原生】看一眼haproxy,秒变技术大佬(理论篇)

一、负载均衡 1、什么是负载均衡&#xff1f; 负载均衡&#xff1a;Load Balance&#xff0c;简称LB&#xff0c;是一种服务或基于硬件设备等实现的高可用反向代理技术&#xff0c;负载均衡将特定的业务(网络服务、网络流量等)分担给指定的一个或多个后端特定的服务器或设备&…

Secure CRT 9.x版本高亮着色配置文件

Secure CRT的网络配置文件高亮显示&#xff0c;还在完善&#xff0c;逐渐适配不同厂商 设备名字自动蓝色高亮显示设备接口名高亮显示IPv4地址、IPv6地址、MAC地址高亮显示掩码、反掩码高亮显示设备SN号高亮显示接口状态、设备状态等高亮显示各路由协议高亮显示 【下载地址】效果…

基于Spring Boot的疗养院管理系统的设计与实现

TOC springboot234基于Spring Boot的疗养院管理系统的设计与实现 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…

输出Docker容器的启动命令行脚本

当Docker容器启动后&#xff0c;如果忘记启动参数&#xff0c;比如目录挂载、端口映射等&#xff0c;可以通过Portainer等容器管理工具查看。但是&#xff0c;有时希望能获取容器启动的命令行&#xff0c;因为需要再启动一个类似容器&#xff0c;怎么办呢&#xff1f; 有一款工…

【Python养成】:输出两个等腰三角形且平行方向

项目场景&#xff1a; 遇到一个小小的高中小程序题目&#xff0c;有趣就做 了一下&#xff0c;供大家参考。 问题描述 要求使用python编程&#xff0c;实现如下图形。 原因分析&#xff1a; 其实就是 找规律和找空格。先左边后右边。具体解释可以找AI。太简单了没必要亲自讲解…

Linux 7 x86平台上安装达梦8数据库

1、环境描述 2、安装前准备 2.1 操作系统信息调研 Linux平台需要通过命令查看操作系统版本、位数、磁盘空间、内存等信息。 CPU信息 [rootray1 ~]# cat /proc/cpuinfo | grep -E "physical id|core id|cpu cores|siblings|cpu MHz|model name|cache size"|tail -n…

【PY模型训练】最终测试

Anacoda3 安装 1. conda -V 2.conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/ 3.打开.condarc文件,将下面内容直接放入.condarc文件里面 channels: - conda-forge - defaults show_channel_urls: true default_ch…

【Qt】 QWidget的cursor属性

QWidget的cursor属性 cursor属性可以设置当鼠标指向不同控件&#xff0c;不同窗口会产生不同的效果。 API说明 cursor() 获取到当前 widget 的 cursor 属性, 返回 QCursor 对象. 当⿏标悬停在该 widget 上时, 就会显⽰出对应的形状. setCursor(const QCursor& cursor) …