嵌入式学习的第二十六天-系统编程-文件IO+目录

news2025/5/23 10:49:04

一、文件IO相关函数

1.read/write cp

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

int main(int argc, char **argv)
{
  if(argc<3)
  {
    fprintf(stderr, "usage:./a.out srcfile dstfile\n");
    return 1;
  }
  int srcfd = open(argv[1],O_RDONLY);
  int dstfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0666);
  if (-1 == srcfd||dstfd==-1)
    {
      fprintf(stderr, "open error\n");
      return 1;
    }
  while(1)
  {

    char buf[1024]={0};
    ssize_t ret= read(srcfd, buf, sizeof(buf));
    if(0==ret)
    {
      break;
    }
    write(dstfd, buf, ret);
  }
  close(srcfd);
  close(dstfd);
  
  return 0;
}

2.文件的插入功能(insert_hw.c)

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

int	main(int argc, char **argv)
{
    FILE*fp=fopen("1.txt","r+");
    if(NULL==fp)
    {
        fprintf(stderr, "fopen error\n");
        return 1;
    }

    char data[]="aaa";
    int pos=4;
    fseek(fp,0,SEEK_END);
    long size=ftell(fp);
    fseek(fp, pos, SEEK_SET);
    char*end = malloc(size-pos);
    if(NULL==end)
    {
        return 1;
    }
    fread(end, size-pos, 1, fp);
    fseek(fp, pos, SEEK_SET);

    fputs(data,fp);
    fputs(end, fp);
    free(end);
    fclose(fp);
    
    return 0;
}

3.查字典

(1)klist.c

#include "./klist.h"

void klist_init(KLIST* head)
{
    head->prev = head;
    head->next = head;
}

void klist_add(KLIST* newnode,KLIST*prev,KLIST* next)
{
    newnode->next =next;
    newnode->prev = prev;
    prev->next = newnode;
    next->prev = newnode;


}

void klist_add_head(KLIST* head,KLIST* newnode)
{
    klist_add(newnode,head,head->next);
}
void klist_add_tail(KLIST* head,KLIST* newnode)
{

    klist_add(newnode,head->prev,head);
}

void klist_del(KLIST*prev,KLIST*next)
{
    prev->next = next;
    next->prev = prev;
}

(2)klist.h

#ifndef __KLIST_H__
#define __KLIST_H__


typedef struct __klist
{
    struct __klist *next;
    struct __klist* prev;
}KLIST;

#define offset(type,mem) ((size_t)  &((type*)0)->mem)
/**
 * @brief ptr 结构体node的指针
            type 结构体 per 
 *       mem  node在结构中的变量名
 */
#define containerof(ptr,type,mem) ({ const typeof(((type*)0)->mem) * _mptr = (ptr);\
   (type*) ((char*)_mptr- offset(type,mem)); })

#define klist_for_entry(ptr,type,mem)  containerof(ptr,type,mem)
/**
 * @brief p , 指向结构体的指针
 *        n, 指向当前结构体的下一个指针
         mem, node在结构体中变量的名字
 */
//for(p=klist_for_entry(&(head)->next,typeof(*p),mem),n=klist_for_entry((p)->mem.next,typeof(*p),mem);
#define klist_for_each(p,n,head,mem) \
for(p=klist_for_entry(head->next,typeof(*p),mem),n=klist_for_entry((p)->mem.next,typeof(*p),mem);\
&p->mem != (head); p=n,n=klist_for_entry((n)->mem.next,typeof(*n),mem))

// #define offset(type,mem) ((size_t) &((type*)0)->mem)
// #define containerof(p,type,mem) ({\
// const typeof(  ((type*)0)->mem ) * _mptr = (p);\
// (type*)((char*)_mptr - offset(type,mem));})
// #define klist_entry(p,type,mem) containerof(p,type,mem)

// #define klist_for_each(p,n,head,node)\
// for(p=klist_entry((head)->next,typeof(*p),node),\
//     n=klist_entry(p->node.next,typeof(*p),node);        \
//     &p->node != (head);p=n,n=klist_entry(n->node.next,typeof(*n),node))

void klist_init(KLIST* head);
void klist_add_head(KLIST* head,KLIST* newnode);
void klist_add_tail(KLIST* head,KLIST* newnode);
void klist_del(KLIST*prev,KLIST*next);

#endif 

 (3)main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "klist.h"
typedef struct
{
  char word[50];
  char mean[512];
  KLIST node;
} DATATYPE;

int add_word(char* word, char* mean, KLIST* head)
{
  DATATYPE* data = malloc(sizeof(DATATYPE));
  if (NULL == data)
    {
      perror("add_per malloc\n");
      return 1;
    }
  strcpy(data->word, word);
  strcpy(data->mean, mean);
  klist_add_tail(head, &data->node);
  return 0;
}

DATATYPE* find_word(KLIST* head, char* word)
{
  DATATYPE *p, *n;
  // p 代表当前节点  n 是当前节点的下一个  head 链表的头指针 node
  // ,自定义结构体中,节点变量的名字

  klist_for_each(p, n, head, node)
  {
    // printf("%d %s\n",p->id,p->name);
    if (0 == strcmp(p->word, word))
      {
        return p;
      }
  }

  return NULL;
}

int main(int argc, char** argv)
{
  FILE* fp = fopen("/home/linux/dict.txt", "r");
  if (NULL == fp)
    {
      return 1;
    }
  KLIST head;
  klist_init(&head);
  while (1)
    {
      char buf[1024] = {0};
      if (NULL == fgets(buf, sizeof(buf), fp))
        {
          break;
        }
      char* word = strtok(buf, " ");
      char* mean = strtok(NULL, "\r");
      add_word(word, mean, &head);
    }

  while (1)
    {
      char want_word[50] = {0};
      printf("input word:");
      fgets(want_word, sizeof(want_word), stdin);  // zoo\n #quit
      want_word[strlen(want_word) - 1] = '\0';
        if(0==strcmp(want_word,"#quit"))
        {
            break;
        }
      DATATYPE* tmp = find_word(&head, want_word);
      if (NULL == tmp)
        {
          printf("can't find, %s\n", want_word);
        }
      else
        {
          printf("%s %s\n", tmp->word, tmp->mean);
        }
    }
  // system("pause");
  return 0;
}

4.lseek

off_t lseek(int fd, off_t offset, int whence);

功能:定位光标的位置

参数:fd:文件描述符;offset:偏移量;正:向后偏移;负:向前偏移;零:不偏移

whence:SEEK_SET;SEEK_CUR;SEEK_END

返回值:成功返回偏移量;失败返回-1

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

int	main(int argc, char **argv)
{
    int fd = open("1.txt", O_WRONLY|O_CREAT|O_TRUNC,0666);
    if(-1==fd)
    {
        fprintf(stderr, "open error");
        return 1;
    }
    off_t offset = lseek(fd, 1024, SEEK_SET);
    printf("%ld\n",offset);
    write(fd, "a", 2);
    close(fd);
    return 0;
}

5.fopen与open 对应权限问题

fopen  open 
w        O_WRONLY|O_CREAT|O_TRUNC 
w+      O_RDWR|O_CREAT|O_TRUNC 
r         O_RDONLY 
r+       O_RDWR
a        O_WRONLY|O_CREAT|O_APPEND
a+      O_RDWR|O_CREAT|O_APPEND

6.fileno     

转换: FILE* fp -> int fd     fgets(,);

int fileno(FILE *stream);

功能:获得一个文件流指针中的文件描述符

参数:stream:文件流指针

返回值:成功返回文件描述符;失败返回-1 

#include<stdio.h>
#include <unistd.h>

int	main(int argc, char **argv)
{
    FILE*fp = fopen("2.txt", "w");
    if(NULL==fp)
    {
        return 1;
    }
    int fd = fileno(fp);
    write(fd, "hello", 5);
    fclose(fp);
    return 0;
}

7.fdopen

转换:int fd -> FILE *fp

FILE *fdopen(int fd, const char *mode);

功能:将文件描述符转化为文件流指针

参数:fd:已经打开的文件描述符

mode:"r"  "r+"  "w"  "w+"  "a"  "a+"

返回值:成功返回文件流指针;失败返回NULL

#include<stdio.h>
#include <unistd.h>
#include<fcntl.h>

int	main(int argc, char **argv)
{
    int fd = open("2.txt", O_RDONLY);
    if(-1==fd)
    {
        return 1;
    }
    FILE*fp = fdopen(fd, "r");
    if(NULL==fp)
    {
        return 1;
    }
    char buf[512]={0};
    fgets(buf,sizeof(buf),fp);
    printf("%s",buf);
    fclose(fp);
    return 0;
}

8.perror 系统错误警告

#include <stdio.h>
#include <errno.h>

int	main(int argc, char **argv)
{
    FILE*fp = fopen("5.txt", "r");
    if(NULL==fp)
    {
        printf("error %d\n",errno);
        perror("fopen main.c:10");
    }
    return 0;
}

二、目录操作

1.步骤

  1. 打开目标目录 
  2. 读取目录
  3. 关闭目录 

(1)opendir

        DIR *opendir(const char *name);

        功能:打开一个目录获得一个目录流指针

        参数:name:目录名

        返回值:成功返回目录流指针;失败返回NULL

(2)readdir
        struct dirent *readdir(DIR *dirp);

        功能:从目录流中读取文件信息并将保存信息的结构体地址返回

        参数:dirp:目录流指针

        返回值:包含文件信息的结构体;出错或者读到目录流末尾返回NULL

(3)关闭目录 

         int closedir(DIR *dirp);

         功能:关闭之前已经打开的目录流对象

         参数:opendir的返回结果中目录流对象

         返回值:成功  0;  失败   -1;

2. 目录的遍历-ls

#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>

int	main(int argc, char **argv)
{
    DIR*dir=opendir("../");
    if(NULL==dir)
    {
        perror("opendir");
        return 1;
    }

    while (1)
    {
       struct dirent*info= readdir(dir);
       if(NULL==info)
       {
         break;
       }
       printf("%s\n",info->d_name);
    }
    closedir(dir);    
    return 0;
}

3.time

tm = time(NULL);

功能:获得1970年到现在的秒数

参数:t:存放秒数的空间首地址

返回值:成功返回1970年到现在的秒数;失败返回-1

#include <stdio.h>
#include <time.h>

int	main(int argc, char **argv)
{
    time_t tm;
    tm =time(NULL);

    printf("%ld\n",tm);
    struct tm*tminfo = localtime(&tm);
    printf("%d-%d-%d %d:%d:%d\n",tminfo->tm_year+1900,tminfo->tm_mon+1,tminfo->tm_mday
    ,tminfo->tm_hour,tminfo->tm_min,tminfo->tm_sec);
    return 0;
}

三、总结

四、补充

1.pwd -获取当前路径

2.ll -i   获取编号

3.数字转字符串

 

4.字符串转数字 atoi

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

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

相关文章

珠宝课程小程序源码介绍

这款珠宝课程小程序源码&#xff0c;基于ThinkPHPFastAdminUniApp开发&#xff0c;功能丰富且实用。ThinkPHP提供稳定高效的后台服务&#xff0c;保障数据安全与处理速度&#xff1b;FastAdmin助力快速搭建管理后台&#xff0c;提升开发效率&#xff1b;UniApp则让小程序能多端…

KNN模型思想与实现

KNN算法简介 核心思想&#xff1a;通过样本在特征空间中k个最相似样本的多数类别来决定其类别归属。"附近的邻居确定你的属性"是核心逻辑 决策依据&#xff1a;采用"多数表决"原则&#xff0c;即统计k个最近邻样本中出现次数最多的类别 样本相似性度量 …

fscan教程1-存活主机探测与端口扫描

实验目的 本实验主要介绍fscan工具信息收集功能&#xff0c;对同一网段的主机进行存活探测以及常见服务扫描。 技能增长 通过本次实验的学习&#xff0c;了解信息收集的过程&#xff0c;掌握fscan工具主机探测和端口扫描功能。 预备知识 fscan工具有哪些作用&#xff1f; …

腾讯2025年校招笔试真题手撕(三)

一、题目 今天正在进行赛车车队选拔&#xff0c;每一辆赛车都有一个不可以改变的速度。现在需要选取速度差距在10以内的车队&#xff08;车队中速度的最大值减去最小值不大于10&#xff09;&#xff0c;用于迎宾。车队的选拔按照的是人越多越好的原则&#xff0c;给出n辆车的速…

怎样通过神经网络估计股票走向

本博文将教会你如何通过神经网络建立股票模型并对其进行未来趋势估计&#xff0c;尽管博主已通过此方法取得一定利润&#xff0c;但是建议大家不要过分相信AI。本博文仅用于代码学习&#xff0c;请大家谨慎投资。 一、通过爬虫爬取股票往年数据 在信息爆炸的当今时代&#xf…

【RocketMQ 生产者和消费者】- 生产者启动源码-上报生产者和消费者心跳信息到 broker(3)

文章目录 1. 前言2. sendHeartbeatToAllBrokerWithLock 上报心跳信息3. prepareHeartbeatData 准备心跳数据4. sendHearbeat 发送心跳上报请求5. broker 处理心跳请求5.1 heartBeat 处理心跳包5.2 createTopicInSendMessageBackMethod 创建重传 topic5.3 registerConsumer 注册…

Python----循环神经网络(Word2Vec的优化)

一、负采样 基本思想&#xff1a; 在训练过程中&#xff0c;对于每个正样本&#xff08;中心词和真实上下文词组成的词对&#xff09;&#xff0c;随机采样少量&#xff08;如5-20个&#xff09;负样本&#xff08;中心词与非上下文词组成的词对&#xff09;。 模型通过区分正…

Simon J.D. Prince《Understanding Deep Learning》

学习神经网络和深度学习推荐这本书&#xff0c;这本书站位非常高&#xff0c;且很多问题都深入剖析了&#xff0c;甩其他同类书籍几条街。 多数书&#xff0c;不深度分析、没有知识体系&#xff0c;知识点零散、章节之间孤立。还有一些人Tian所谓的权威&#xff0c;醒醒吧。 …

开搞:第四个微信小程序:图上县志

原因&#xff1a;我换了一个微信号来搞&#xff0c;因为用同一个用户&#xff0c;备案只能一个个的来。这样不行。所以我换了一个。原来注册过小程序。现在修改即可。注意做好计划后&#xff0c;速度备案和审核&#xff0c;不然你时间浪费不起。30元花起。 结构&#xff1a; -…

Seata源码—7.Seata TCC模式的事务处理一

大纲 1.Seata TCC分布式事务案例配置 2.Seata TCC案例服务提供者启动分析 3.TwoPhaseBusinessAction注解扫描源码 4.Seata TCC案例分布式事务入口分析 5.TCC核心注解扫描与代理创建入口源码 6.TCC动态代理拦截器TccActionInterceptor 7.Action拦截处理器ActionIntercept…

【语法】C++的map/set

目录 平衡二叉搜索树 set insert() find() erase() swap() map insert() 迭代器 erase() operator[] multiset和multimap 在之前学习的STL中&#xff0c;string&#xff0c;vector&#xff0c;list&#xff0c;deque&#xff0c;array都是序列式容器&#xff0c;它们的…

vue vite textarea标签按下Shift+Enter 换行输入,只按Enter则提交的实现思路

注意input标签不能实现&#xff0c;需要用textarea标签 直接看代码 <template><textareav-model"message"keydown.enter"handleEnter"placeholder"ShiftEnter 换行&#xff0c;Enter 提交"></textarea> </template>&l…

深入理解 PlaNet(Deep Planning Network):基于python从零实现

引言&#xff1a;基于模型的强化学习与潜在动态 基于模型的强化学习&#xff08;Model-based Reinforcement Learning&#xff09;旨在通过学习环境动态的模型来提高样本效率。这个模型可以用来进行规划&#xff0c;让智能体在不需要与真实环境进行每一次决策交互的情况下&…

仿腾讯会议——视频发送接收

1、 添加音频模块 2、刷新图片&#xff0c;触发重绘 3、 等比例缩放视频帧 4、 新建视频对象 5、在中介者内定义发送视频帧的函数 6、完成发送视频的函数 7、 完成开启/关闭视频 8、绑定视频的信号槽函数 9、 完成开启/关闭视频 10、 完成发送视频 11、 完成刷新图片显示 12、完…

从3.7V/5V到7.4V,FP6291在应急供电智能门锁中的应用

在智能家居蓬勃发展的当下&#xff0c;智能门锁以其便捷、安全的特性&#xff0c;成为现代家庭安防的重要组成部分。在智能门锁电量耗尽的情况下&#xff0c;应急电源外接移动电源&#xff08;USB5V输入&#xff09; FP6291升压到7.4V供电可应急开锁。增强用户在锁具的安全性、…

【人工智障生成日记1】从零开始训练本地小语言模型

&#x1f3af; 从零开始训练本地小语言模型&#xff1a;MiniGPT TinyStories&#xff08;4090Ti&#xff09; &#x1f9ed; 项目背景 本项目旨在以学习为目的&#xff0c;从头构建一个完整的本地语言模型训练管线。目标是&#xff1a; ✅ 不依赖外部云计算✅ 完全本地运行…

Selenium-Java版(frame切换/窗口切换)

frame切换/窗口切换 前言 切换到frame 原因 解决 切换回原来的主html 切换到新的窗口 问题 解决 回到原窗口 法一 法二 示例 前言 参考教程&#xff1a;Python Selenium Web自动化 2024版 - 自动化测试 爬虫_哔哩哔哩_bilibili 上期文章&#xff1a;Sel…

一文深度解析:Pump 与 PumpSwap 的协议机制与技术差异

在 Solana 链上&#xff0c;Pump.fun 和其延伸产品 PumpSwap 构成了 meme coin 发行与流通的两大核心场景。从初期的游戏化发行模型&#xff0c;到后续的自动迁移与交易市场&#xff0c;Pump 系列协议正在推动 meme coin 从“爆发性投机”走向“协议化运营”。本文将从底层逻辑…

星云智控v1.0.0产品发布会圆满举行:以创新技术重构物联网监控新生态

星云智控v1.0.0产品发布会圆满举行&#xff1a;以创新技术重构物联网监控新生态 2024年5月15日&#xff0c;成都双流蛟龙社区党群服务中心迎来了一场备受业界瞩目的发布会——优雅草科技旗下”星云智控v1.0.0”物联网AI智控系统正式发布。本次发布会吸引了包括沃尔沃集团、新希…

SpringBoot(一)--- Maven基础

目录 前言 一、初始Maven 1.依赖管理 2.项目构建 3.统一项目结构 二、IDEA集成Maven 1.Maven安装 2.创建Maven项目 2.1全局设置 2.2 创建SpringBoot项目 2.3 常见问题 三、单元测试 1.JUnit入门 2.断言 前言 Maven 是一款用于管理和构建Java项目的工具&#xff…