《嵌入式Linux應用編程(二):標準IO高級操作與文件流定位實戰》

今日學習內容

1. 行輸入函數安全實踐

(1) fgets vs gets

函數安全特性換行符處理緩沖區保護
fgets指定讀取長度(size-1保留\n并添加\0安全(防溢出)
gets無長度限制\n替換為\0危險

?

2. Linux標準文件流

文件流符號設備?
標準輸入stdin鍵盤?
標準輸出stdout顯示器?
標準錯誤stderr顯示器?

?

3. 塊數據操作核心函數

(1) fwrite數據寫入

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);  

?

  • 參數解析
    • ptr:數據源首地址
    • size:單個元素字節數(如sizeof(int)
    • nmemb:寫入元素個數
    • stream:目標文件流
  • 返回值:實際寫入元素個數(非字節數)

(2) fread數據讀取

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);  

?

  • 返回值語義
    • 成功:實際讀取元素個數
    • 文件末尾:0
    • 錯誤:元素數小于請求值

4. 文件流定位三劍客

函數原型核心功能
fseekint fseek(FILE*, long, int)重定位文件指針
ftelllong ftell(FILE*)獲取當前偏移量(字節)
rewindvoid rewind(FILE*)重置指針到文件開頭
fseek(fp, 100, SEEK_SET); // 從開頭偏移100字節  
fseek(fp, -50, SEEK_CUR); // 從當前位置回退50字節  
fseek(fp, 0, SEEK_END);  // 定位到文件末尾  

?

5. 高級文件操作技巧

//fread#include <stdio.h>struct stu
{int id;char name[32];int score;
};int main(void)
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}struct stu s[10];size_t cnt = fread(s, sizeof(struct stu), 5, fp);printf("%ld\n", cnt);for(int i = 0;i < cnt; ++i){printf("%d %s %d\n", s[i].id, s[i].name, s[i].score);}fclose(fp);return 0;
}
//fwrite#include <stdio.h>struct stu
{int id;char name[32];int score;
};int main(int argc, const char *argv[])
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}struct stu s[5] = {{1, "a", 12}, {2,"b", 34},{3, "c", 56}, {4,"d", 78},{5, "e", 90},};size_t cnt = fwrite(s, sizeof(struct stu), 5, fp);printf("%ld\n", cnt);fclose(fp);return 0;
}
//文件大小
#include <stdio.h>int main(void)
{FILE *fp = fopen("./1.txt", "r");if(NULL == fp){printf("open error\n");return -1;}fseek(fp, 0, SEEK_END);long offset = ftell(fp);printf("%ld\n", offset);fseek(fp, 0, SEEK_SET);fclose(fp);return 0;}
//copy#include <stdio.h>int main(void)
{  FILE *fpsrc = fopen("./1.txt", "r");FILE *fpdest = fopen("./2.txt", "w");if(NULL == fpsrc || NULL == fpdest){printf("open error\n");return -1;}fseek(fpsrc, 0, SEEK_END);long offset = ftell(fpsrc);fseek(fpsrc, 0, SEEK_SET);fseek(fpdest, offset, SEEK_SET);fputc(0, fpdest);fseek(fpdest, 0, SEEK_SET);char buffer[100] = {0};size_t cnt = fread(buffer, offset, 1, fpsrc);fwrite(buffer, offset, 1, fpdest);fclose(fpdest);fclose(fpsrc);return 0;}
//打印bmp圖片的文件信息和圖像信息#include <stdio.h>#pragma pack(1)//bmp文件相關信息
typedef struct tagBITMAPFILEHEADER {short    bfType;         // 文件類型標志int      bfSize;         // 文件大小,單位為字節short    bfReserved1;    // 保留字節short    bfReserved2;    // 保留字節int      bfOffBits;      // 數據偏移量,即實際圖像數據開始的位置
}Bmp_file_head_t;
//bmp圖像信息
typedef struct tagBITMAPINFOHEADER {int   biSize;         // BITMAPINFOHEADER的大小,單位為字節int    biWidth;        // 位圖的寬度,單位為像素int    biHeight;       // 位圖的高度,單位為像素short    biPlanes;       // 目標設備的位平面數,必須為1short    biBitCount;     // 每像素位數(顏色深度)int   biCompression;  // 圖像壓縮類型int   biSizeImage;    // 圖像大小,單位為字節int    biXPelsPerMeter;// 水平分辨率,單位為像素/米int    biYPelsPerMeter;// 垂直分辨率,單位為像素/米int   biClrUsed;      // 實際使用顏色數int   biClrImportant; // 重要顏色數
}Bmp_info_t;
#pragma pack()int get_bmp_head_info(const char *bmpname, Bmp_file_head_t *pheadinfo, Bmp_info_t *pbmpinfo)
{FILE *fp = fopen(bmpname, "r");if (NULL == fp){printf("fopen error\n");return -1;}fread(pheadinfo, sizeof(Bmp_file_head_t), 1, fp);fread(pbmpinfo, sizeof(Bmp_info_t), 1, fp);fclose(fp);return 0;
}int main(int argc, const char *argv[])
{Bmp_file_head_t headinfo;Bmp_info_t bmpinfo;get_bmp_head_info("./3.bmp", &headinfo, &bmpinfo);printf("sizeof(Bmp_file_head_t) = %ld\n", sizeof(Bmp_file_head_t));printf("sizeof(Bmp_info_t) = %ld\n", sizeof(Bmp_info_t));printf("biWidth = %d, biHeight = %d, biBitCount = %d\n", bmpinfo.biWidth, bmpinfo.biHeight, bmpinfo.biBitCount);return 0;
}
//字典#include <stdio.h>
#include <string.h>
char line[500];
char word[50];
int reserchWord(char *word)
{FILE *fp = fopen("./dict.txt", "r");if(NULL == fp){printf("open error\n");return -1;}int t = 0;while(NULL != fgets(line, sizeof(line), fp)){char *find = strtok(line, " ");if(NULL == find){printf("errror\n");continue;}if(0 == strcmp(find, word)){t = 1;printf("find\n");printf("解釋:%s\n", line + strlen(find) + 1);break;}}if(t == 0){printf("not found\n");}fclose(fp);return 0;
}int main(void)
{printf("  字典  \n");printf("輸入不超過五十個字符的單詞\n");printf("輸入.quit中斷程序\n");while(1){char s[50] = {0};scanf("%s", s);if(0 == strcmp(s, ".quit")){printf("over\n");break;}reserchWord(s);       }return 0;
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95130.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95130.shtml

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

相關文章

Springboot2+vue2+uniapp 小程序端實現搜索聯想自動補全功能

目錄 一、實現目標 1.1 需求 1.2 實現示例圖: 二、實現步驟 2.1 實現方法簡述 2.2 簡單科普 2.3 實現步驟及代碼 一、實現目標 1.1 需求 搜索聯想——自動補全 &#xff08;1&#xff09;實現搜索輸入框&#xff0c;用戶輸入時能顯示模糊匹配結果 &am…

極簡 5 步:Ubuntu+RTX4090 源碼編譯 vLLM

極簡 5 步&#xff1a;UbuntuRTX4090 源碼編譯 vLLM1. 系統依賴&#xff08;一次性&#xff09;2. 進入源碼目錄 & 激活環境3. 啟用 ccache 自動并行度4. 拉代碼 編譯&#xff08;2 行搞定&#xff09;5. 更新 flash-attn&#xff08;與 vLLM 配套&#xff09;6. 啟動 4 …

生產工具革命:定制開發開源AI智能名片S2B2C商城小程序重構商業生態的范式研究

摘要互聯網作為信息工具已深刻改變商業生態&#xff0c;但其本質仍停留在效率優化層面。本文提出&#xff0c;基于定制開發開源AI智能名片與S2B2C商城小程序的深度融合&#xff0c;正在引發生產工具層面的革命性變革。該技術架構通過重構"人-貨-場"關系&#xff0c;實…

Transformer前傳:Seq2Seq與注意力機制Attention

前言 參考了以下大佬的博客 https://blog.csdn.net/v_july_v/article/details/127411638 https://blog.csdn.net/andy_shenzl/article/details/140146699 https://blog.csdn.net/weixin_42475060/article/details/121101749 https://blog.csdn.net/weixin_43334693/article/det…

企業架構工具篇之ArchiMate的HelloWorld(2)

本文通過ArchiMate做一個員工報銷流程設計的小demo,按照步驟都可以做出來,在做這個demo之前先簡單認識下Archimate的開發界面: 模型樹(Models)窗口:通常位于左上方,以樹形結構展示一個或多個 ArchiMate 模型。用戶可在此瀏覽模型的整體結構,快速定位到特定的模型元素,…

Docker 詳解(保姆級安裝+配置+使用教程)

文章目錄一、初識 Docker二、Docker 命令1、安裝2、配置鏡像加速器檢查配置是否生效3、服務相關命令4、鏡像相關命令5、容器相關命令三、Docker 容器數據卷1、數據卷概念2、數據卷作用3、配置數據卷4、配置數據卷容器四、Docker 應用部署五、備份與遷移六、Dockerfile七、Docke…

做調度作業提交過程簡單介紹一下

?作業提交與執行流程前文提到在 Linux 的 HPC 或超算環境中&#xff0c;可以只在共享存儲上安裝一次應用程序&#xff0c;然后所有計算節點通過掛載共享目錄來訪問和執行這些程序&#xff0c;那么作業提交及執行過程是怎么樣的流程呢&#xff1f;結構說明&#xff1a;第一行是…

【Altium designer】解決報錯“Access violation at address...“

問題現象如上AD9原理圖工程所示報錯&#xff0c;當我關閉這個“CMM-WEIER-VA”原理圖工程以及其他不相關的原理圖工程出現報錯&#xff1a;Access violation at address 0832A5EC in module WorkspaceManager.DLL. Read of address 00000061 at 0832A5EC&#xff0c;任務管理器…

小杰python高級(three day)——numpy庫

1.numpy數組的操作&#xff08;1&#xff09;數組的連接stack該函數可以實現多個數組的堆疊(連接)&#xff0c;會創建新的軸&#xff0c;用于沿著新的軸連接一系列數組&#xff0c;所有數組必須具有相同的形狀。可以增加數組的維度。假設輸入的每個數組都是 n 維數組&#xff0…

視頻剪輯的工作流程

準備素材 1.準備音頻&#xff0c;視頻、圖片等素材 2.準備Pr創建的序列、彩條、字母、倒計時片頭等功能性素材 創建項目 創建項目是詩篇剪輯的第一步&#xff0c;創建一個指定名稱與存放位置的項目文件&#xff0c;用來通義管理整個視頻項目創建序列 序列決定剪輯的尺寸、幀速率…

下一個排列 的 思路總結

文章目錄思路分析&#xff1a; 倒序遍歷&#xff1a;題目要求的是下一個排列&#xff0c;那么肯定數字的跳躍不能太大&#xff0c;所以可以比較好確定的是&#xff0c;遍歷的順序是倒序遍歷比較方向&#xff1a;對于每一個數字&#xff0c;需要找到右邊最大的比它小的數字&…

Spring Cloud-面試題(49)

摘要&#xff1a; 1、通俗易懂&#xff0c;適合小白 2、僅做面試復習用&#xff0c;部分來源網絡&#xff0c;博文免費&#xff0c;知識無價&#xff0c;侵權請聯系&#xff01; 1. 什么是Spring Cloud框架&#xff1f;子項目哪幾大類&#xff1f; Spring Cloud是一套分布式系…

資源查看-iostat命令

文章目錄 系統中未安裝 iostat 命令 1. 監控CPU與磁盤的基礎負載 2. 診斷I/O性能瓶頸 3. 實時監控與動態采樣 4. 特定設備或分區的精細化監控 5. 性能測試與基準數據生成 6. 結合其他工具進行綜合調優 總結 結果輸出速查表 第一部分:CPU統計信息 第二部分:設備/磁盤統計信息(…

STM32 HAL庫外設編程學習筆記

STM32 HAL庫外設編程 1. 概述 本文檔是基于STM32 HAL庫的外設編程學習筆記&#xff0c;主要包括以下外設的配置和使用方法&#xff1a; GPIO&#xff1a;通用輸入輸出接口ADC&#xff1a;模數轉換器UART&#xff1a;通用異步收發器TIM&#xff1a;定時器I2C&#xff1a;內部…

DHCP服務配置與管理實戰指南

DHCP 服務配置與管理筆記 一、DHCP 核心概念 1. DHCP 定義與功能 DHCP (Dynamic Host Configuration Protocol)&#xff1a;動態主機配置協議核心功能&#xff1a; 自動分配 IP 地址提供子網掩碼、網關、DNS 等網絡參數管理 IP 地址租約周期 典型應用&#xff1a;ADSL撥號、企業…

WebSocket 在多線程環境下處理 Session并發

WebSocket 在多線程環境下處理 Session并發時&#xff0c;常見問題包括狀態沖突&#xff08;如 IllegalStateException&#xff09;、消息亂序、連接超時等。以下是綜合各技術方案的解決方案&#xff0c;分為單機多線程和分布式集群兩類場景&#xff1a;&#x1f512; 一、單機…

JDBC的連接過程(超詳細)

JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 用于訪問數據庫的標準 API&#xff0c;它允許 Java 程序與各種不同類型的數據庫進行交互&#xff0c; 其連接數據庫的過程主要包含以下幾個步驟&#xff1a;1. 導入 JDBC 驅動依賴在使用 JDBC 連接數據庫之前&a…

本地WSL部署接入 whisper + ollama qwen3:14b 總結字幕校對增強版

1. 實現功能 M4-4: 校對增強版 (最終完全體) 本腳本是整個 Module 的最終形態&#xff0c;采用了“代碼預處理 LLM校對”的終極方案&#xff1a; 代碼預處理: 確定性地在每個語音片段后添加逗號&#xff0c;生成一份“標點草稿”。LLM校對: LLM 的任務被簡化為“校對和修正”這…

MySQL數據庫簡介

1 簡介 MySQL是一個關系型數據庫管理系統&#xff0c;由瑞典 MySQL AB公司開發&#xff0c;屬于 Oracle 旗下產品&#xff0c;是當今最流行的關系型數據庫管理系統之一&#xff0c;在 WEB應用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#…

[Oracle] UNPIVOT 列轉行

Oracle數據庫中的UNPIVOT是一種用于將列轉換為行的SQL操作&#xff0c;它允許用戶將多個列的數據轉換為多行的形式&#xff0c;以便進行更靈活的數據分析和報表生成UNPIVOT主要用于將寬表(多列)轉換為長表(多行)&#xff0c;減少表的列數&#xff0c;增加行數語法格式SELECT pi…