I/O編程技術(文件IO)筆記綱要梳理

来源:https://www.cnblogs.com/zqingyang/p/18218543
-Advertisement-
Play Games

序言Linux基本知識回顧 Linux內核安全管理機制 根文件系統rootfs Linux根目錄下文件結構 Linux文件類型標準IO 標準IO操作數據流分析 文件 打開、關閉 fopen( ) fclose( ) 文件 字元讀寫 fgetc( ) fputc( ) 文件 行讀寫 fgets( ) ...


序言
Linux基本知識回顧
Linux內核安全管理機制
根文件系統rootfs
Linux根目錄下文件結構
Linux文件類型
標準IO
標準IO操作數據流分析
文件 打開、關閉
fopen( )
fclose( )
文件 字元讀寫
fgetc( )
fputc( )
文件 行讀寫
fgets( )
fputs( )
文件 數據快讀寫
fread( )
fwrite( )
文件 當前位置偏移量 獲取 設置
ftell( )
fseek( )
rewind( )
文件 狀態判斷
feof( )、ferror( )
標準輸入設備 讀取、輸出
getchar( )
putchar( )
時間函數
time( )
localtime( )
刷新緩衝區
fflush( )
系統IO
打開關閉
open( )
close( )
數據讀寫
read( )
write( )
文件位置偏移量
lseek( )
記憶體映射
mmap( )
實踐開發
LCD屏幕顯像原理
驅動架構
軟體層
LCD內核源碼
文件控制
ioctl( ) 文件控制
mmap( )記憶體映射
munmap()解除映射
屏幕顯示
BMP圖像的儲存
其它函數
sscanf( )
描述
聲明
參數
返回值
strcmp( )
remove()
getchar()
strftime()
atoi()
參考文檔

序言

儘可能壓縮筆記,核心在於構建核心知識單元網路。

Linux基本知識回顧

Linux內核安全管理機制

fig:

根文件系統rootfs

fig:

Linux根目錄下文件結構

fig:

Linux文件類型

-(regular) 普通文件
d(directory) 目錄文件
p(pipe) 管道文件
s(socket) 套接字文件
l(link) 鏈接文件
c(character) 字元設備文件
b(block) 塊設備文件

標準IO

標準IO操作數據流分析

fig:

文件操作介面

文件 打開、關閉

fopen( )

fig:

加b是以二進位處理

fclose( )

fig:

文件 字元讀寫

fgetc( )

fig:

fputc( )

fig:

文件 行讀寫

fgets( )

fig:

fputs( )

fig:

文件 數據快讀寫

fread( )

fig:

fwrite( )

fig:

字元串要用strlen函數,sizeof(“字元串”)得到的是地址一個字長。

文件 當前位置偏移量 獲取 設置

ftell( )

fig:

相較於文件開頭的位元組數

fseek( )

fig:

rewind( )

fig:

rewind(fp)相等於fseek(fp, 0L, SEEK_SE);

文件 狀態判斷

feof( )、ferror( )

fig:

標準輸入設備 讀取、輸出

getchar( )

getchar( )預設從標準輸入設備讀取一個字元。

putchar( )

putchar( )預設從標準輸出設備輸出一個字元。

時間函數

time( )

獲取1970至今的秒數

localtime( )

轉換timer的值為tm結構 後的值

刷新緩衝區

fflush( )

刷新全緩衝

系統IO

api:應用程式編程介面

sdk:軟體開發工具包

標準I/O可以看成是在系統I/O的基礎上封裝了緩衝機制。

文件描述符是一個小的非負整數。

打開關閉

open( )

fig:

close( )

fig:

數據讀寫

read( )

fig:

write( )

fig:

文件位置偏移量

lseek( )

fig:

記憶體映射

mmap( )

fig:

fig:

實踐開發

LCD屏幕顯像原理

偏光片、彩色濾光片

像素數量、

像素色深(位深度、色域) : bit-->4Bytes-->ARGB

驅動架構

Framebuffer驅動子系統

粵嵌屏幕解析度 800*480。

ll: c或b開頭的都是硬體設備驅動提供的文件

設備文件在/dev/fb0

軟體層

LCD內核源碼

要看內核源碼

Linux最多支持32塊(編號0~31)LCD屏幕.

文件控制

ioctl( ) 文件控制

該函數是一個專用於設備輸入輸出操作的系統調用,該調用傳入一個跟設備有關的請求碼,系統調用的功能完全取決於請求碼。

fig:

ioctl(文件描述符,請求碼,某類型指針) 可以獲取或設置硬體設備的參數

#include <sys/ioctl.h>
int ioctl(int fd, unsigned long request, ...);

下麵我們解釋各個參數的含義。
1)fd是文件描述符。當我們的設備作為特殊文件被open()函數打開後,會返回一個文件描述符,通過操作這個文件描述符達到操作設備文件的目的。

2)request是命令碼,應用程式通過下發命令碼來控制驅動程式完成對應操作。

3)第三個參數“…”是可變參數arg,一些情況下應用程式需要向驅動程式傳參,參數就通過ag來傳遞。ioctl函數中的“…”只能傳遞一個參數,但內核不會檢查這個參數的類型。那麼,就有兩種傳參方式:只傳一個整數,傳遞一個指針。

如果ioctl執行成功,它的返回值就是驅動程式中ioctl介面給的返回值,驅動程式可以通過返回值向用戶程式傳參。但驅動程式最好返回一個非負數,因為用戶程式中的ioctl運行失敗時一定會返回-1並設置全局變數errorno。

errono不同的值代表的含義如下:

EBADF:fd是一個無效的文件描述符。
EFAULT:在arg是指針的前提下,argp指向一個不可訪問的記憶體空間。
EINVAL:request或argp是無效的。
ENOTTY:fd沒有關聯到一個字元特殊設備,或該request不適用於文件描述符fd引用的對象類型。(說人話就是fd沒有指向一個字元設備,或fd指向的文件不支持ioctl操作)

因此,在用戶空間調用ioctl時,可以使用如下的錯誤判斷處理。包括的兩個頭文件,string.h聲明瞭strerror函數,errno.h定義了錯誤碼errno。

#include <string.h>
#include <errno.h>

int ret;
ret = ioctl(fd, MYCMD);
if (ret == -1)
printf("ioctl: %s\n", strerror(errno));

mmap( )記憶體映射

fig:

fig:

munmap()解除映射

#include <sys/mman.h>

int munmap(void *addr, size_t length);

munmap()系統調用解除指定地址範圍內的映射,參數 addr 指定待解除映射地址範圍的起始地址,它必須是系統頁大小的整數倍;參數 length 是一個非負整數,指定了待解除映射區域的大小(位元組數),被解除映射的區域對應的大小也必須是系統頁大小的整數倍,即使參數 length 並不等於系統頁大小的整數倍,與 mmap()函數相似。

需要註意的是,當進程終止時也會自動解除映射(如果程式中沒有顯式調用 munmap()),但調用 close() 關閉文件時並不會解除映射。

通常將參數 addr 設置為 mmap()函數的返回值,將參數 length 設置為 mmap()函數的參數 length,表示解除整個由 mmap()函數所創建的映射。

屏幕顯示

BMP圖像的儲存

BMP圖像記憶體採用小端存儲.

fig:

其它函數

sscanf( )

描述

C 庫函數 int sscanf(const char *str, const char *format, ...) 從字元串讀取格式化輸入。

聲明

下麵是 sscanf() 函數的聲明。

int sscanf(const char *str, const char *format, ...)

參數

  • str -- 這是 C 字元串,是函數檢索數據的源。
  • format -- 這是 C 字元串,包含了以下各項中的一個或多個:空格字元、非空格字元format 說明符
    format 說明符形式為 [=%*[modifiers]type=],具體講解如下:

參數

描述

*

這是一個可選的星號,表示數據是從流 stream 中讀取的,但是可以被忽視,即它不存儲在對應的參數中。

width

這指定了在當前讀取操作中讀取的最大字元數。

modifiers

為對應的附加參數所指向的數據指定一個不同於整型(針對 d、i 和 n)、無符號整型(針對 o、u 和 x)或浮點型(針對 e、f 和 g)的大小: h :短整型(針對 d、i 和 n),或無符號短整型(針對 o、u 和 x) l :長整型(針對 d、i 和 n),或無符號長整型(針對 o、u 和 x),或雙精度型(針對 e、f 和 g) L :長雙精度型(針對 e、f 和 g)

type

一個字元,指定了要被讀取的數據類型以及數據讀取方式。具體參見下一個表格。

sscanf 類型說明符:

類型

合格的輸入

參數的類型

c

單個字元:讀取下一個字元。如果指定了一個不為 1 的寬度 width,函數會讀取 width 個字元,並通過參數傳遞,把它們存儲在數組中連續位置。在末尾不會追加空字元。

char *

d

十進位整數:數字前面的 + 或 - 號是可選的。

int *

e,E,f,g,G

浮點數:包含了一個小數點、一個可選的前置符號 + 或 -、一個可選的後置字元 e 或 E,以及一個十進位數字。兩個有效的實例 -732.103 和 7.12e4

float *

o

八進位整數。

int *

s

字元串。這將讀取連續字元,直到遇到一個空格字元(空格字元可以是空白、換行和製表符)。

char *

u

無符號的十進位整數。

unsigned int *

x,X

十六進位整數。

int *

  • 附加參數
  • -- 這個函數接受一系列的指針作為附加參數,每一個指針都指向一個對象,對象類型由 format 字元串中相應的 % 標簽指定,參數與 % 標簽的順序相同。
  • 針對檢索數據的 format 字元串中的每個 format 說明符,應指定一個附加參數。如果您想要把 sscanf 操作的結果存儲在一個普通的變數中,您應該在標識符前放置引用運算符(&),例如:
  • int n;
    sscanf (str,"%d",&amp;n);

返回值

如果成功,該函數返回成功匹配和賦值的個數。如果到達文件末尾或發生讀錯誤,則返回 EOF。

strcmp( )

C 庫函數 int strcmp(const char *str1, const char *str2)str1 所指向的字元串和 str2 所指向的字元串進行比較。

聲明

下麵是 strcmp() 函數的聲明。

int strcmp(const char *str1, const char *str2)

參數

  • str1 -- 要進行比較的第一個字元串。
  • str2 -- 要進行比較的第二個字元串。

返回值

該函數返回值如下:

  • 如果返回值小於 0,則表示 str1 小於 str2。
  • 如果返回值大於 0,則表示 str1 大於 str2。
  • 如果返回值等於 0,則表示 str1 等於 str2。

remove()

描述

C 庫函數 int remove(const char *filename) 刪除給定的文件名 filename,以便它不再被訪問。

聲明

下麵是 remove() 函數的聲明。

int remove(const char *filename)

參數

  • filename -- 這是 C 字元串,包含了要被刪除的文件名稱。

返回值

如果成功,則返回零。如果錯誤,則返回 -1,並設置 errno。

getchar()

描述

C 庫函數 int getchar(void) 從標準輸入 stdin 獲取一個字元(一個無符號字元)。這等同於 getc 帶有 stdin 作為參數。

聲明

下麵是 getchar() 函數的聲明。

int getchar(void)

參數

  • NA

返回值

該函數以無符號 char 強制轉換為 int 的形式返回讀取的字元,如果到達文件末尾或發生讀錯誤,則返回 EOF。

strftime()

描述

C 庫函數 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根據 format 中定義的格式化規則,格式化結構 timeptr 表示的時間,並把它存儲在 str 中。

聲明

下麵是 strftime() 函數的聲明。

size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)

參數

  • str -- 這是指向目標數組的指針,用來複制產生的 C 字元串。
  • maxsize -- 這是被覆制到 str 的最大字元數。
  • format -- 這是 C 字元串,包含了普通字元和特殊格式說明符的任何組合。這些格式說明符由函數替換為表示 tm 中所指定時間的相對應值。格式說明符是:

說明符

替換為

實例

%a

縮寫的星期幾名稱

Sun

%A

完整的星期幾名稱

Sunday

%b

縮寫的月份名稱

Mar

%B

完整的月份名稱

March

%c

日期和時間表示法

Sun Aug 19 02:56:02 2012

%d

一月中的第幾天(01-31)

19

%H

24 小時格式的小時(00-23)

14

%I

12 小時格式的小時(01-12)

05

%j

一年中的第幾天(001-366)

231

%m

十進位數表示的月份(01-12)

08

%M

分(00-59)

55

%p

AM 或 PM 名稱

PM

%S

秒(00-61)

02

%U

一年中的第幾周,以第一個星期日作為第一周的第一天(00-53)

33

%w

十進位數表示的星期幾,星期日表示為 0(0-6)

4

%W

一年中的第幾周,以第一個星期一作為第一周的第一天(00-53)

34

%x

日期表示法

08/19/12

%X

時間表示法

02:50:06

%y

年份,最後兩個數字(00-99)

01

%Y

年份

2012

%Z

時區的名稱或縮寫

CDT

%%

一個 % 符號

%

  • timeptr

-- 這是指向 tm 結構的指針,該結構包含了一個被分解為以下各部分的日曆時間:

struct tm {
int tm_sec; /* 秒,範圍從 0 到 59 */
int tm_min; /* 分,範圍從 0 到 59 */
int tm_hour; /* 小時,範圍從 0 到 23 */
int tm_mday; /* 一月中的第幾天,範圍從 1 到 31 */
int tm_mon; /* 月份,範圍從 0 到 11 */
int tm_year; /* 自 1900 起的年數 */
int tm_wday; /* 一周中的第幾天,範圍從 0 到 6 */
int tm_yday; /* 一年中的第幾天,範圍從 0 到 365 */
int tm_isdst; /* 夏令時 */
};

返回值

如果產生的 C 字元串小於 size 個字元(包括空結束字元),則會返回覆制到 str 中的字元總數(不包括空結束字元),否則返回零。

atoi()

描述

C 庫函數 int atoi(const char *str) 把參數 str 所指向的字元串轉換為一個整數(類型為 int 型)。

聲明

下麵是 atoi() 函數的聲明。

int atoi(const char *str)

參數

  • str -- 要轉換為整數的字元串。

返回值

該函數返迴轉換後的長整數,如果沒有執行有效的轉換,則返回零。

參考文檔

本文來自博客園,作者:舟清颺,轉載請註明原文鏈接:https://www.cnblogs.com/zqingyang/p/18218543


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 工廠模式(Factory Pattern)是一種創建型設計模式,它提供了一種創建對象的介面,而不是通過具體類來實例化對象。工廠模式可以將對象的創建過程封裝起來,使代碼更具有靈活性和可擴展性。 工廠模式有幾種常見的實現方式: 簡單工廠模式(Simple Factory Pattern): 簡單工廠模式 ...
  • 一:背景 1. 講故事 前些天群里有一個朋友說他們軟體會偶發崩潰,想分析看看是怎麼回事,所幸的是自己會抓dump文件,有了dump就比較好分析了,接下來我們開始吧。 二:WinDbg 分析 1. 程式為什麼會崩潰 windbg 還是非常強大的,當你雙擊打開的時候會自動幫你定位過去展示崩潰時刻的寄存器 ...
  • StackExchange.Redis 是一個高性能的 Redis 客戶端庫,主要用於 .NET 環境下與 Redis 伺服器進行通信,大名鼎鼎的stackoverflow 網站就使用它。它使用非同步編程模型,能夠高效處理大量請求。支持 Redis 的絕大部分功能,包括發佈/訂閱、事務、Lua 腳本等... ...
  • 爆了,爆了,DeveloperSharp系列近期又被製造業ERP、民航飛行App、建築BIM、電力掌上營業廳、等多家大型採用,站在巨人的肩膀上你能走的更遠。 支持.Net Core2.0及以上,支持.Net Framework4.0及以上 http請求調用是開發中經常會用到的功能。在內,調用自有項目 ...
  • 前言:有時候遠程伺服器的進程你想偷偷去圍觀一下有哪些,或者對一些比較調皮的進程進行封殺,或者對一些自己研發的服務進行遠程手動啟動或者重啟等,又不想打開遠程桌面,只想悄咪咪地執行,那也許下麵的文章會對你有啟發。 前提條件 確保遠程伺服器(服務端)已啟用WinRM。在遠程伺服器上運行以下命令可以啟用和配 ...
  • !!!是的沒錯,胖友們,保姆教程系列又更新了!!! @目錄前言簡介一、磁碟分區二、文件系統三、實際操作1. 使用lsblk命令查看新加入的磁碟信息2. 使用fdisk或者cfdisk分區新磁碟,並將分區標記為Linux文件系統類型(83)3. 格式化新分區,使用mkfs命令4. 創建掛載目錄,使用m ...
  • 1. 為什麼要有線程 我們知道一個集成應用場景需要多個進程同時調度執行各自的功能,那麼多進程的本質就是產生多個執行流,每個執行流執行不同的代碼和功能,但是一個進程由PCB(task_struct)、進程地址空間、頁表、文件描述符表等資源組成,是一個資源集合,創建的開銷較大,那麼為了滿足用戶的多執行流 ...
  • 目錄題目解析代碼展示process_A.cprocess_B.cprocess_C.c結果展示重要知識點記錄 題目 設計一個程式,作為進程A,進程A專門創建一個信號量集,要求信號量集中有1個信號量,對信號量集合中的信號量進行設置,要求集合中的信號量的初值為1,然後再設計2個程式,分別是進程B和進程C ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...