Linux編程 IO(標準io,文件io,目錄io)

標準IO?

?C語言標準IO概述

標準IO(Standard Input/Output)是C語言中用于處理文件和數據流的一組函數庫,定義在<stdio.h>頭文件中。與低級IO(如read/write)相比,標準IO提供了緩沖機制,提高了數據讀寫的效率。標準IO的核心是FILE結構體指針,通過它操作文件流。


fopen/fclose

功能

  • fopen:打開文件并返回文件指針。
  • fclose:關閉文件并釋放資源。

函數原型

FILE *fopen(const char *filename, const char *mode);
int fclose(FILE *stream);

參數說明

  • filename:文件路徑。
  • mode:打開模式(如"r"只讀,"w"寫入,"a"追加等)。
  • stream:已打開的文件指針。

示例

FILE *fp = fopen("test.txt", "w");
if (fp == NULL) {perror("Error opening file");return 1;
}
fclose(fp);


fgetc/fputc

功能

  • fgetc:從文件流中讀取一個字符。
  • fputc:向文件流寫入一個字符。

函數原型

int fgetc(FILE *stream);
int fputc(int c, FILE *stream);

示例

FILE *fp = fopen("test.txt", "r");
int ch = fgetc(fp); // 讀取一個字符
fputc('A', fp);     // 寫入字符'A'


fgets/fputs

功能

  • fgets:從文件流讀取一行字符串。
  • fputs:向文件流寫入字符串(不自動添加換行符)。

函數原型

char *fgets(char *str, int n, FILE *stream);
int fputs(const char *str, FILE *stream);

參數說明

  • str:存儲讀取數據的緩沖區。
  • n:最多讀取的字符數(包括\0)。

示例

char buffer[100];
fgets(buffer, 100, stdin); // 從標準輸入讀取
fputs("Hello", stdout);    // 輸出到標準輸出


fscanf/fprintf

功能

  • fscanf:格式化輸入(類似scanf,但針對文件流)。
  • fprintf:格式化輸出(類似printf,但針對文件流)。

函數原型

int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);

示例

int num;
fscanf(fp, "%d", &num);       // 從文件讀取整數
fprintf(fp, "Number: %d", 42); // 寫入格式化字符串


fread/fwrite

功能

  • fread:從文件流讀取二進制數據塊。
  • fwrite:向文件流寫入二進制數據塊。

函數原型

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

參數說明

  • ptr:數據緩沖區指針。
  • size:每個數據項的字節數。
  • nmemb:要讀寫的數據項數量。

示例

int arr[5] = {1, 2, 3, 4, 5};
fwrite(arr, sizeof(int), 5, fp); // 寫入數組
fread(arr, sizeof(int), 5, fp);  // 讀取數組


fseek/rewind/ftell

功能

  • fseek:設置文件流的位置指針。
  • rewind:重置文件指針到開頭。
  • ftell:返回當前文件指針位置(字節偏移量)。

函數原型

int fseek(FILE *stream, long offset, int whence);
void rewind(FILE *stream);
long ftell(FILE *stream);

參數說明

  • offset:偏移量。
  • whence:基準位置(SEEK_SET開頭,SEEK_CUR當前位置,SEEK_END末尾)。

示例

fseek(fp, 10, SEEK_SET); // 移動到第10字節
rewind(fp);              // 回到文件開頭
long pos = ftell(fp);    // 獲取當前位置

利用fread和fwrite實現圖片的拷貝

#include "../head.h"int main(void)
{FILE *fsrc = NULL;FILE *fdst = NULL;ssize_t nret = 0;char srcfile[256] = {0};char dstfile[256] = {0};char tmpbuff[4096] = {0};printf("請輸入源圖片:\n");fgets(srcfile, sizeof(srcfile), stdin);srcfile[strlen(srcfile)-1] = '\0';printf("請輸入目的圖片:\n");fgets(dstfile, sizeof(dstfile), stdin);dstfile[strlen(dstfile)-1] = '\0';fsrc = fopen(srcfile, "r");if (NULL == fsrc){perror("fail to fopen");return -1;}fdst = fopen(dstfile, "w");if (NULL == fdst){perror("fail to fopen");return -1;}while (1){nret = fread(tmpbuff, 1, sizeof(tmpbuff), fsrc);if (0 == nret){break;}fwrite(tmpbuff, 1, nret, fdst);}fclose(fsrc);fclose(fdst);return 0;
}

統計一個文件中出現最多的字符是哪個,出現了多少次

鏈表法
#include "../head.h"
#include "cirlist.h"int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;linknode *pcirlist = NULL;linknode *ptmpnode = NULL;char ch = 0;pcirlist = create_empty_linklist();fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}/* 如果第一次出現則新增該節點 */ptmpnode = find_linklist(pcirlist, ch);if (NULL == ptmpnode){insert_tail_linklist(pcirlist, ch);}/* 從鏈表中找到節點,計數器自加 */ptmpnode = find_linklist(pcirlist, ch);ptmpnode->cnt++;}fclose(fp);ptmpnode = find_max_node(pcirlist);if (ptmpnode != NULL){*pmaxchar = ptmpnode->data;*pmaxcnt = ptmpnode->cnt;}destroy_linklist(&pcirlist);return 0;
}   int main(void)
{char filename[256] = {0};int maxcnt = 0;int maxchar = 0;int ret = 0;printf("請輸入要檢測的文件名:\n");m_fgets(filename);ret = find_max_char(filename, &maxchar, &maxcnt);if (ret != 0){printf("fild max char failed\n");return -1;}printf("出現最多的字符:%c, 次數:%d\n", maxchar, maxcnt);return 0;
}
數組法
#include "../head.h"int find_max_char(char *filename, int *pmaxchar, int *pmaxcnt)
{FILE *fp = NULL;int cnt[256] = {0};char ch = 0;int max = 0;int i = 0;fp = fopen(filename, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){ch = fgetc(fp);if (EOF == ch){break;}cnt[ch]++;}fclose(fp);max = 0;for (i = 1; i < 256; i++){if (cnt[i] > cnt[max]){max = i;}}*pmaxchar = max;*pmaxcnt = cnt[max];return 0;
}   int main(void)
{char filename[256] = {0};int maxcnt = 0;int maxchar = 0;int ret = 0;printf("請輸入要檢測的文件名:\n");m_fgets(filename);ret = find_max_char(filename, &maxchar, &maxcnt);if (ret != 0){printf("fild max char failed\n");return -1;}printf("出現最多的字符:%c, 次數:%d\n", maxchar, maxcnt);return 0;
}

文件IO

1.概念

  • 標準IO是有緩存的IO,文件IO沒有緩存,適合于通信、硬件設備操作
  • 標準IO是庫函數,文件IO是系統調用

2.系統調用與庫函數

  • 系統調用:是Linux內核中的代碼,只能在Linux系統中使用
  • 庫函數:是對系統調用的封裝,可以在不同的操作系統中安裝并使用,庫函數最終還是要調用系統 調用完成對應功能

3.文件IO函數接口

1. 函數接口:

2. 文件打開:

注意:
  • 有三個特殊的文件描述符:標準輸入(0)、標準輸出(1)、標準錯誤(2)
  • 文件描述符特點: 非負整數
  • 取尚未被占用的最小的非負整數 文件描述符是有上限的,到達上限后再打開會報錯誤

3. 關閉文件描述符

4. 請寫出標準IO對應的文件IO的打開方式

5. 文件IO讀寫

1. write

2. read

6. 文件描述符偏移量的定位

1. lseek

7. 文件IO與標準IO互相轉換的函數

1. fileno 功能:根據文件流指針獲得文件描述符

2. fdopen 功能:根據已經打開的文件描述符獲得文件流指針

3. feof 功能:判斷文件流指針是否到達末尾

4. ferror 功能:判斷文件流指針是否出錯

目錄IO

1.操作方式:

  • 打開目錄文件
  • 讀取目錄文件中的目錄項
  • 關閉目錄文件

2.函數接口:

1. opendir

2. closedir

3. readdir

4. getcwd

5. chdir

6. mkdir

注意:
  • r:讀權限,決定用戶是否能夠查看目錄下所有文件名
  • w:寫權限,決定用戶是否能夠在目錄下新建文件
  • x:執行權限,決定用戶是否能夠進入目錄

7. rmdir

3.文件名和路徑:

  • file.txt:文件名
  • ./file.txt:路徑

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

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

相關文章

C# WPF本地Deepseek部署

模型下載地址 using LLama; using LLama.Common; using System; using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Input;namespace YF_Talk {public partial class MainWindow : Window{private LLamaWeights _model;private LLa…

【Abp.VNext】Abp.Vnext框架模塊學習

1、Abp.Vnext-集成 Volo.Abp.Core2、Abp.vNext-Web模塊 Volo.Abp.AspNetCore.MVC框架&#xff08;framework文件夾&#xff09; 七、Abp.vNext-應用模塊-Identity身份認證 業務模塊&#xff08;modules文件夾->identity&#xff09; 1、添加領域模型 Volo.Abp.Identity.Doma…

【完整源碼+數據集+部署教程】火柴實例分割系統源碼和數據集:改進yolo11-rmt

背景意義 研究背景與意義 在計算機視覺領域&#xff0c;實例分割技術作為一種重要的圖像處理方法&#xff0c;近年來得到了廣泛的關注和應用。實例分割不僅能夠識別圖像中的物體類別&#xff0c;還能精確地分割出每個物體的輪廓&#xff0c;提供更為細致的視覺信息。這一技術在…

飛算JavaAI云原生實踐:基于Docker與K8s的自動化部署架構解析

一、飛算JavaAI詳細介紹 1.1 飛算JavaAI飛算JavaAI是飛算云智推出的一款革命性Java開發輔助工具&#xff0c;它通過人工智能技術深度賦能傳統軟件開發流程&#xff0c;特別為大學生課程設計、畢業設計等實踐教學環節提供了強有力的技術支持。在當前高校計算機相關專業教學中&am…

小程序打通美團核銷:解鎖到店綜合業態私域密碼,賦能6000+門店破局增長

數字化浪潮奔涌而來&#xff0c;棋牌室、臺球廳、親子樂園等線下綜合業態面臨經營轉型的關鍵節點。小程序與美團核銷功能的深度耦合&#xff0c;正成為撬動私域流量的核心杠桿&#xff0c;為超6000家門店打通了一條低成本、高轉化的經營快車道。過往經營模式中&#xff0c;線上…

Linux Shell:Nano 編輯器備忘

打開文件 sudo nano /etc/apt/sources.list選中多行&#xff0c;然后刪除 用方向鍵將光標定位到要刪除的起始位置按下 Alt A 設置錨點用方向鍵選擇要刪除的區域 (以上 3 步是為了選中文本)用 Ctrl K(剪切) 或 Alt D(直接刪除) 全選并刪除 按下 Alt \ 將光標移動到文件開頭…

常見的設計模式(2)單例模式

目錄 一、版本一&#xff1a;禁用構造與拷貝 二、版本二&#xff1a;注冊析構函數/嵌套垃圾回收 &#xff08;1&#xff09;使用atexit注冊程序結束時的函數 &#xff08;2&#xff09;使用對象嵌套垃圾回收 三、版本三&#xff1a;線程安全 四、版本四&#xff1a;編譯器…

JAiRouter 0.2.1 更新啦:內存優化 + 配置合并 + IP 限流增強,運維體驗再升級

JAiRouter 0.2.1 更新啦&#xff1a;內存優化 配置合并 IP 限流增強&#xff0c;運維體驗再升級 如果你已經在 0.2.0 生產環境中穩定運行&#xff0c;那么這篇更新會讓你無痛升級&#xff0c;直接“更輕、更穩、更省心”。 &#x1f4ce; 官方倉庫 & issue 直達 https://…

學習嵌入式第二十六天

文章目錄IO(續上)1.標準IO1.標準IO的接口2.流的定位2.文件IO1.概念&#xff1a;2.系統調用和庫函數3.文件IO函數接口習題IO(續上) 1.標準IO 1.標準IO的接口 fwrite 原型&#xff1a;size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); 功能&#xff1…

GDB 程序啟動參數設置深度指南

GDB 程序啟動參數設置深度指南 1. 概述 在程序調試過程中&#xff0c;正確設置啟動參數對于驗證程序行為、重現特定場景至關重要。GDB提供多種靈活的方式設置啟動參數&#xff0c;特別是當您需要調試命令行參數處理邏輯或配置敏感型應用時。 2. 參數設置的核心方法 2.1 啟動GDB…

Autudl華為昇騰系列NPU簡介和部署推理yolo11 yolov8 yolov5分割模型

0.配置Autudl 下面圖片是我所租的昇騰卡和具體環境版本&#xff0c;太具體的就不說了&#xff0c;有需要的話我單獨出一期Autudl租顯卡的教程&#xff0c;主要是為了學習昇騰環境如何運行Yolo系列模型。 0.1華為昇騰芯片&#xff08;Ascend&#xff09;簡介 1.Ascend 310&…

什么是JSP和Servlet以及二者的關系

JSP&#xff08;JavaServer Pages&#xff09; 是“HTML 里寫 Java”的模板技術&#xff0c;最終會被容器轉換成 Servlet。Servlet 是“Java 里寫 HTML”的 Java 類&#xff0c;直接繼承 javax.servlet.http.HttpServlet&#xff0c;用來接收/響應 HTTP 請求。Servlet 是什么 純…

【WonderTrader源碼詳解 1】【環境搭建 2】【編譯安裝WonderTrader】

一、引言 本篇來講述如何搭建 wondertrader 和 wtpy 二、wondertrader 2.1 源碼下載 # /home/leo/sda_1.6TBgit clone https://gitee.com/wondertrader/wondertrader.gitgit clone https://gitee.com/wondertrader/wtpy.git2.2 源碼編譯 cd /home/leo/sda_1.6TB/wondertrader/s…

hutool 作為http 客戶端工具調用的一點點總結

場景一&#xff1a;客戶端timeout 的時間給的很短//100毫秒 private static final int HTTP_TIMEOUT_MS 1 * 100; response HttpUtil.createPost(patrolresultconfirmUrl).body(JSONObject.toJSONString(search)).header("Authorization", token).timeout(HTTP_TI…

基于MongoDB/HBase的知識共享平臺的設計與實現

標題:基于MongoDB/HBase的知識共享平臺的設計與實現內容:1.摘要 在當今信息爆炸的時代&#xff0c;知識的有效共享和管理變得愈發重要。本研究的目的是設計并實現一個基于MongoDB/HBase的知識共享平臺&#xff0c;以滿足大規模知識數據的存儲、高效查詢和快速共享需求。方法上&…

PHP數組操作:交集、并集和差集

1. 交集&#xff08;Intersection&#xff09;交集是指兩個集合中都存在的元素。$array1 [1, 2, 3, 4]; $array2 [3, 4, 5, 6];$intersection array_intersect($array1, $array2); print_r($intersection); // 輸出: Array ( [2] > 3 [3] > 4 )2. 并集&#xff08;Uni…

Qt 常用控件 - 7

Text Edit&#xff08;多行輸入框&#xff09;QTextEdit 表示多行輸入框&#xff0c;也是一個富文本 & markdown 編輯器&#xff0c;能在內容超出范圍時自動提供滾動條。QTextEdit&#xff1a;不僅僅能表示純文本&#xff0c;還可以表示 htnl 和 markdownQPlainTextEdit&am…

JDK、eclipse的安裝,配置JDK、Tomcat并使用eclipse創建項目

目錄一、JDK的安裝1. 安裝JDK2. 配置環境變量3. 檢查jdk是否已安裝二、eclipse的安裝1. 解壓安裝2. 設置字體大小3. 設置拼寫提示三、tomcat安裝四、創建項目1. 第一次創建一個普通的java項目2. 第一次創建一個java web項目擴展&#xff1a;運行項目報Tomcat端口占用&#xff0…

Iptables 詳細使用指南

目錄 1. 工作原理? 2. 核心架構&#xff08;四表五鏈&#xff09; 2.1 四張表&#xff08;優先級從高到低&#xff09; 2.2 五條內置鏈&#xff08;數據包流向&#xff09; 3. Iptables規則 3.1 規則的匹配條件與目標動作 常見匹配條件&#xff08;用于篩選數據包&…

Vue 服務端渲染(SSR)詳解

Vue SSR是一種在服務端將 Vue 應用渲染成 HTML 字符串&#xff0c;然后直接發送到客戶端的技術。相比傳統的客戶端渲染&#xff0c;Vue SSR 能帶來更好的 SEO 性能和更快的首屏加載時間。下面我們從零到一&#xff0c;結合項目源碼&#xff0c;詳細講解如何實現一個 Vue SSR 項…