嵌入式學習的第二十六天-系統編程-文件IO+目錄

一、文件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 #quitwant_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.pswp.cn/news/907113.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907113.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907113.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SCADA|KingSCADA信創4.0-Win10安裝過程

哈嘍,你好啊,我是雷工! 現如今很多地方開始要求信創版, 最近就遇到一個現場要求用信創。 首先找官方要了最新的信創版安裝包。 由于有之前安裝組態王授權驅動裝藍屏的經歷,此次特意問了下該標識win10的軟件是否可以在win11系統上安裝。 技術反饋win11專業版上可以安裝…

AI時代新詞-人工智能倫理審查(AI Ethics Review)

一、什么是人工智能倫理審查&#xff08;AI Ethics Review&#xff09;&#xff1f; 人工智能倫理審查&#xff08;AI Ethics Review&#xff09;是指在人工智能&#xff08;AI&#xff09;系統的開發、部署和使用過程中&#xff0c;對其可能涉及的倫理、法律和社會問題進行系…

GitLab 從 17.10 到 18.0.1 的升級指南

本文分享從 GitLab 中文本 17.10.0 升級到 18.0.1 的完整過程。 升級前提 查看當前安裝實例的版本。有多種方式可以查看&#xff1a; 方式一&#xff1a; /help頁面 可以直接在 /help頁面查看當前實例的版本。以極狐GitLab SaaS 為例&#xff0c;在瀏覽器中輸入 https://ji…

python:基礎爬蟲、搭建簡易網站

一、基礎爬蟲代碼&#xff1a; # 導包 import requests # 從指定網址爬取數據 response requests.get("http://192.168.34.57:8080") print(response) # 獲取數據 print(response.text)二、使用FastAPI快速搭建網站&#xff1a; # TODO FastAPI 是一個現代化、快速…

從0開始學習R語言--Day10--時間序列分析數據

在數據分析中&#xff0c;我們經常會看到帶有時間屬性的數據&#xff0c;比如股價波動&#xff0c;各種商品銷售數據&#xff0c;網站的網絡用戶活躍度等。一般來說&#xff0c;根據需求我們會分為兩種&#xff0c;分析歷史數據的特點和預測未來時間段的數據。 移動平均 移動平…

倚光科技在二元衍射面加工技術上的革新:引領光學元件制造新方向?

倚光科技二元衍射面加工技術&#xff08;呈現出細膩的光碟反射紋路&#xff09; 在光學元件制造領域&#xff0c;二元衍射面的加工技術一直是行業發展的關鍵驅動力之一。其精準的光相位調制能力&#xff0c;在諸多前沿光學應用中扮演著不可或缺的角色。然而&#xff0c;長期以來…

【redis原理篇】底層數據結構

SDS Redis是基于C語言實現的&#xff0c;但是Redis中大量使用的字符串并沒有直接使用C語言字符串。 一、SDS 的設計動機 傳統 C 字符串以 \0 結尾&#xff0c;存在以下問題&#xff1a; 性能瓶頸&#xff1a;獲取長度需遍歷字符數組&#xff0c;時間復雜度 O(n)。緩沖區溢出…

尚硅谷redis7 20-redis10大類型之zset

zset是redis中的有序集合【sorted set】 zset就是在set基礎上&#xff0c;每個val值前加一個score分數值。 之前set是k1 v1 v2 v3現在zset是k1 score1 v1 score2 v2 向有序集合中加入一個元素和該元素的分數 ZADD key score member [score member...] 添加元素 127. 0. 0. …

STM32 SPI通信(軟件)

一、SPI簡介 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司開發的一種通用數據總線四根通信線&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08;Master Input Slav…

Kotlin Native與C/C++高效互操作:技術原理與性能優化指南

一、互操作基礎與性能瓶頸分析 1.1 Kotlin Native調用原理 Kotlin Native通過LLVM編譯器生成機器碼,與C/C++的互操作基于以下核心機制: CInterop工具:解析C頭文件生成Kotlin/Native綁定(.klib),自動生成類型映射和包裝函數雙向調用約定: Kotlin調用C:直接通過生成的綁…

云原生安全 SaaS :從基礎到實踐

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 1. 基礎概念 什么是 SaaS&#xff1f; SaaS&#xff08;Software as a Service&#xff0c;軟件即服務&#xff09;是一種基于云計算的軟件交付模式。用…

git clone 提速

git上的項目時間久了 .git文件夾非常大&#xff0c;這時候更新一次項目需要花費很長的時間&#xff0c;解決方法也很簡單&#xff0c;加一個depth參數&#xff0c;命令如下&#xff1a; git clone --depth 1 https://github.com/xxxxxx/xxxxxx指定了 depth 1 的時候&#xff0…

Redis 性能優化:核心技術、技巧與最佳實踐

Redis 作為高性能的內存數據庫,其性能優化是系統設計中的關鍵環節。本文結合 Redis 官方文檔及實踐經驗,從內存管理、延遲優化、CPU 效率、網絡配置等多個維度,系統性地闡述 Redis 性能優化的核心技術與最佳實踐。 通過以下優化手段,Redis 可在高并發、低延遲場景中發揮極致…

PostgreSQL 14 pacemaker 高可用集群

核心架構原理 集群組成&#xff08;典型三節點結構&#xff09;&#xff1a; [Node1] PostgreSQL Pacemaker Corosync pcsd [Node2] PostgreSQL Pacemaker Corosync pcsd [Node3] PostgreSQL Pacemaker Corosync pcsd ? ? ? ← Corosync 多…

影刀Fun叉鳥-2048

文章目錄 僅為自動化演示&#xff0c;實際2048判定邏輯需要更加嚴謹 參考代碼 # 使用提醒: # 1. xbot包提供軟件自動化、數據表格、Excel、日志、AI等功能 # 2. package包提供訪問當前應用數據的功能&#xff0c;如獲取元素、訪問全局變量、獲取資源文件等功能 # 3. 當此模塊作…

Vue3.5 企業級管理系統實戰(二十):角色菜單

本篇聚焦于角色菜單權限分配功能的實現&#xff0c;圍繞“給角色賦予菜單權限”這一核心場景&#xff0c;從接口設計、組件封裝到頁面集成展開完整技術方案的闡述。主要內容包括&#xff1a; 1. 角色權限接口開發&#xff1a;定義獲取角色權限、分配權限等接口&#xff0c;規范…

go實現釘釘三方登錄

釘釘的的官方開發文檔中只給出了java實現三方登錄的&#xff0c;我們準備用go語言來實現 實現網頁方式登錄應用&#xff08;登錄第三方網站&#xff09; - 釘釘開放平臺 首先就是按照文檔進行操作&#xff0c;備注好網站的信息 獲得應用憑證&#xff0c;我們后面會用到 之后…

一、OpenCV的基本操作

目錄 1、OpenCV的模塊 2、OpenCV的基礎操作 2.1圖像的IO操作 2.2繪制幾何圖形 2.3獲取并修改圖像中的像素點 2.4 獲取圖像的屬性 2.5圖像通道的拆分與合并 2.6色彩空間的改變 3、OpenCV的算數操作 3.1圖像的加法 3.2圖像的混合 3.3總結 1、OpenCV的模塊 2、OpenCV的基…

虛擬機配置橋接,遠程工具直接訪問

虛擬機網絡配置 前言windows下安裝linux虛擬機配置網絡1、設置虛擬機網絡模式&#xff1a;橋接模式2、配置網絡參數1、查看本機電腦連接的網絡情況2、打開虛擬機&#xff0c;編輯配置文件3、編輯虛擬網絡 3、測試連通性 前言 好不容易裝上了虛擬機&#xff0c;輸入命令時又發現…

RabbitMQ 概述與安裝

MQ 作用與介紹 MQ 是什么 MQ (message queue),從字面意思看是一個隊列, FIFO 先進先出,只不過里面存放的內容是 消息 消息 可以比較簡單,比如只包含 文本字符串,JSON 等;也可以很復雜,比如 內嵌對象 等 MQ 多用于分布式系統之間進行通信 系統之間的調用通常有兩種方式: 1…