linux高級編程(文件I/O)

標準I/O與文件I/O的區別:

文件操作:
? ? ? ? ?緩存 ? ? ? ? ? 操作對象 ? ? ? ? ? ? ? ?具體操作
標準IO ?全緩存/行緩存 ? 文件指針(流指針)FILE * ?1.打開 --fopen ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.讀寫?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?fgetc/fputc?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?fgets/fputs?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?fread/fwrite?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? ?3.關閉?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?fclose?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?4.定位?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?fseek/ftell/rewind?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ? ?
文件IO ?不帶緩存 ? ? ? ?文件描述符 (整數) ? ? ? 1.打開 --open?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.讀寫 --read/write
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?3.關閉 --close?
?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?4.定位 --lseek?

特性:

? ? ? ? .1 沒有緩存區 (//可以認為數據直接交給了內核 )
?? ??? ?.2 操作對象不在是流(FILE *),而是文件描述符(整數)
?? ??? ?.3文件描述符
?? ??? ? ?很小的非負的整數?? ?int ? 0-1023
?? ??? ? ?內核每打開一個文件就會獲得一個文件?? ?描述符? ?

?????????每個程序在啟動的時候操作系統默認為其打開
?? ??? ? ???三個描述符與流對象匹配:
?? ??? ? ??????0 ==>STDIN_FILENO === stdin
?? ??? ? ???? ?1 ==>STDOUT_FILENO == stdout
?? ??? ? ??????2 ==>STDERR_FILENO == stderr
? ? ??
?? ??? ? ?stdin,stdout,stderr,===>FILE*

優缺點:

標準I/O:

優點:

  1. 緩沖:標準I/O使用了緩沖區,可以減少對文件的直接訪問,提高性能。
  2. 格式化輸出:標準I/O函數如printfscanf提供了強大的格式化功能,可以方便地處理格式化輸入輸出。
  3. 跨平臺:標準I/O函數在大多數操作系統上都是可用的,提高了代碼的可移植性。

缺點:

  1. 性能:與文件I/O相比,標準I/O可能會有額外的性能開銷,因為它包含了額外的緩沖和格式化處理。
  2. 復雜性:標準I/O函數可能比文件I/O函數更復雜,需要更多的參數和錯誤處理。

文件I/O:

優點:

  1. 性能:文件I/O直接操作文件描述符,沒有額外的緩沖和格式化處理,因此通常比標準I/O更快。
  2. 靈活性:文件I/O提供了更多的控制和靈活性,允許程序員直接操作文件和文件描述符。
  3. 無緩沖:文件I/O可以直接讀寫文件,無需緩沖區,這使得它可以用于處理非常大的文件或需要實時處理的數據。

缺點:

  1. 復雜性:文件I/O函數通常比標準I/O函數更復雜,需要更多的參數和錯誤處理。
  2. 格式化:文件I/O不提供格式化功能,需要程序員手動處理數據格式。
  3. 跨平臺:文件I/O函數在不同的操作系統上可能有不同的行為,這降低了代碼的可移植性。

一般在沒有特殊要求的情況下,在linux下優先選擇文件I/O

open()

1.open
?? ??? ?open("1.c",O_WRONLY|O_CREAT,0666 );
?? ??? ?
?? ??? ?int open(const char *pathname, int flags,int mode);
?? ??? ?功能:
?? ??? ??? ?獲得一個文件描述符
?? ??? ?參數:
?? ??? ??? ?pathname:文件名
?? ??? ??? ?flags:
?? ??? ??? ?必須項:他們之間是互斥的,所以有且只能有一個?
?? ??? ??? ??? ?O_RDONLY
?? ??? ??? ??? ?O_WRONLY
?? ??? ??? ??? ?O_RDWR
?? ??? ??? ?可選項:
?? ??? ??? ?O_CREAT, 創建文件 ?//這個標志量存在,則需要指定參數 mode
?? ??? ??? ?O_EXCL, ?需要和O_CREAT同時使用,表示新建的文件不存在,成功,否則open就會失敗
?? ??? ??? ?O_TRUNC ?文件內容清空
?? ??? ??? ?O_APPEND追加
?? ??? ??? ?
?? ? ? ? ? ?//后面
?? ??? ??? ?O_NOCTTY,不是終端設備
?? ??? ??? ?O_ASYNC 異步io,什么時候io不確定,
?? ??? ??? ?O_NONBLOCK 非阻塞?

一般在創建文件時,都加入截斷操作,標準io中w=O_CREAT | O_WRONLY | O_TRUNC

write()

?? ?2.write
?? ??? ?char buf[1024];
?? ??? ?ssize_t write(int fd, ?const ?void *buf, size_t count);
?? ??? ?功能:
?? ??? ??? ?通過文件描述符向文件中寫一串數據
?? ??? ?參數:
?? ??? ??? ?fd:文件描述符
?? ??? ??? ?buf:要寫入文件的字符串的首地址
?? ??? ??? ?count:要寫入字符的個數
?? ??? ?返回值:?
?? ??? ??? ?成功返回實際寫入的個數
?? ??? ??? ?失敗返回-1

read()

3.read
?? ??? ?ssize_t read(int fd, void *buf, size_t count);
?? ??? ?功能:
?? ??? ??? ?通過文件描述符讀取文件中的數據
?? ??? ?參數:
?? ??? ??? ?fd:文件描述符
?? ??? ??? ?buf:存放數據空間的首地址
?? ??? ??? ?count:要讀到數據的個數
?? ??? ?返回值:
?? ??? ??? ?成功返回讀到數據的個數
?? ??? ??? ?失敗返回-1
?? ??? ??? ?讀到文件結尾返回0

lssek()

4.lseek? ==? fseek, rewind ftell
?? ??? ?off_t lseek(int fd, off_t offset, int whence);
?? ??? ?功能:
?? ??? ??? ?定位文件的位置
?? ??? ?參數:
?? ??? ??? ?fd:文件描述符
?? ??? ??? ?offset:偏移量
?? ??? ??? ??? ??? ??? ?正:向后偏移
?? ??? ??? ??? ??? ??? ?負:向前偏移
?? ??? ??? ??? ??? ??? ?零:不偏移
?? ??? ??? ?whence:
?? ??? ??? ??? ?SEEK_SET
?? ??? ??? ??? ?SEEK_CUR
?? ??? ??? ??? ?SEEK_END
?? ??? ??? ??? ? ? ? ? ? 正 空洞?
?? ??? ?返回值:
?? ??? ??? ?成功返回偏移量
?? ??? ??? ?失敗返回-1
?? ??? ??? ?lseek(fd,0,SEEK_END);

文件描述符與流指針的轉換:

filino:

int fileno(FILE *stream);
功能:
?? ?獲得一個文件流指針中的文件描述符
參數:
?? ?stream:文件流指針
返回值:
?? ?成功返回文件描述符
?? ?失敗返回-1

fdopen:

2.fdopen?? ?int fd -> FILE *fp
?FILE *fdopen(int fd, const char *mode);
?功能:
?? ?將文件描述符轉化為文件流指針
?參數:
?? ?fd:已經打開的文件描述符
?? ?mode:
?? ??? ?"r"
?? ??? ?"r+"
?? ??? ?"w"
?? ??? ?"w+"
?? ??? ?"a"
?? ??? ?"a+"
?返回值:
?? ?成功返回文件流指針
?? ?失敗返回NULL?? ?

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

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

相關文章

Windows右鍵沒有新建Word、PPT與Excel的解決方法

本文介紹在Windows電腦中,右鍵與資源管理器的“新建”選項中,都沒有新建Word、PPT或Excel文件的解決方法。 最近,發現一臺重裝了系統與Office的電腦中,無論是桌面上與資源管理器中的右鍵,還是資源管理器左側頂部的“新…

力扣1546.和為目標值且不重疊的非空子數組的最大數目

力扣1546.和為目標值且不重疊的非空子數組的最大數目 從頭開始找 找到滿足條件的就清空哈希表 class Solution {public:int maxNonOverlapping(vector<int>& nums, int target) {int n nums.size();vector<int> s(n1);for(int i0;i<n;i) s[i1] s[i] n…

手寫簡單模擬mvc

目錄結構&#xff1a; 兩個注解類&#xff1a; Controller&#xff1a; package com.heaboy.annotation;import java.lang.annotation.*;/*** 注解沒有功能只是簡單標記* .RUNTIME 運行時還能看到* .CLASS 類里面還有&#xff0c;構建對象久沒來了&#xff0c;這個說明…

掌握Vue 3生命周期:從組合式API到高效代碼實踐

引言 在 Vue 3 中&#xff0c;生命周期的概念得到了進一步的優化和簡化。Vue 3 引入了組合式 API&#xff08;Composition API&#xff09;&#xff0c;這為開發者提供了更靈活的方式來組織和重用代碼邏輯。與傳統的選項式 API&#xff08;Options API&#xff09;相比&#x…

node-sass 老版本4.14.0 安裝失敗解決辦法

舊項目 npm install 發現 node-sass 安裝 失敗 切換淘寶鏡像之后 不能完全解決問題。因為需要編譯&#xff0c;本地沒有Python環境不能實現 安裝node-sass時&#xff0c;在install階段會從Github上下載一個叫binding.node的文件&#xff0c;而「GitHub Releases」里的文件…

C++編譯鏈接原理

從底層剖析程序從編譯到運行的整個過程 三個階段 一、編譯階段二、鏈接階段三、運行階段 為了方便解釋&#xff0c;給出兩端示例代碼&#xff0c;下面圍繞代碼進行實驗&#xff1a; //sum.cpp int gdata 10; int sum(int a,int b) {return ab; }//main.cpp extern int gdata…

Stream流的簡單用法

filter //stream流中的filter //filter 方法用于通過設置的條件過濾出元素。以下代碼片段使用 filter 方法過濾掉空字符串&#xff1a; List<String> filter Arrays.asList("mz", "", "mz55", "m", "MZ"); Stream&l…

初始redis:在Ubuntu上安裝redis

1.先切換到root用戶 使用su命令切換到root 2.使用apt命令來搜索redis相關的軟件包 命令&#xff1a;apt search redis 3.下載redis 命令&#xff1a; apt install redis 在Ubuntu 20.04中 &#xff0c;下載的redis版本是redis5 4.查看redis狀態 命令&#xff1a; netst…

Python自動化測試系列[v1.0.0][高效自動化設計]

Python多線程應用于自動化測試 將多線程在測試巧妙地應用&#xff0c;確實會帶來很多好處&#xff0c;并且這是充分利用機器資源執行高效率測試很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

LLM 入門與實踐(四) Yi 部署與分析

本文截取自20萬字的《PyTorch實用教程》&#xff08;第二版&#xff09;&#xff0c;敬請關注&#xff1a;《Pytorch實用教程》&#xff08;第二版&#xff09;無論是零基礎入門&#xff0c;還是CV、NLP、LLM項目應用&#xff0c;或是進階工程化部署落地&#xff0c;在這里都有…

python對象

類 我們目前所學習的對象都是Python內置的對象但是內置對象并不能滿足所有的需求&#xff0c;所以我們在開發中經常需要自定義一些對象類&#xff0c;簡單理解它就相當于一個圖紙。在程序中我們需要根據類來創建對象類就是對象的圖紙&#xff01;我們也稱對象是類的實例&#…

JAVA--IO流

一、IO流什么&#xff1f; I/O是Input/output的縮寫&#xff0c;用于處理設備之間的數據傳輸。如讀/寫文件、網絡通訊。 java程序中&#xff0c;對于數據的輸入、輸出是以流&#xff08;Stream)的方式進行。 Java.io包下提供了各種流類和接口&#xff0c;用以獲取不同種類的數…

web自動化(六)unittest 測試報告跳過用例

三種類型測試報告&#xff1a;unittest.TextTestRunner、BeautifulReport、HTMLTestRunner Python3.0 無法直接安裝 HTMLTestRunner 安裝 XTestRunner pip install XTestRunner安裝 BeautifulReport pip install BeautifulReportimport unittestclass TestSkipCase(unittest…

ELfK logstash filter模塊常用的插件 和ELFK部署

ELK之filter模塊常用插件 logstash filter模塊常用的插件&#xff1a; filter&#xff1a;表示數據處理層&#xff0c;包括對數據進行格式化處理、數據類型轉換、數據過濾等&#xff0c;支持正則表達式 grok 對若干個大文本字段進行再分割成一些小字段 (?<字段名…

【算法篇】KMP算法,一種高效的字符串匹配算法

我們今天了解一個字符串匹配算法-KMP算法&#xff0c;內容難度相對來說較高&#xff0c;建議先收藏再細品&#xff01;&#xff01;&#xff01; KMP算法的基本概念 KMP算法是一種高效的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#…

LLMs之gptpdf:gptpdf的簡介、安裝和使用方法、案例應用之詳細攻略

LLMs之gptpdf&#xff1a;gptpdf的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 gptpdf的簡介 1、處理流程 第一步&#xff0c;使用 PyMuPDF 庫&#xff0c;對 PDF 進行解析出所有非文本區域&#xff0c;并做好標記&#xff0c;比如: 第二步&#xff0c;使用視覺大模型&…

離婚后,孩子就讀私立高中的高昂學費誰承擔?

江蘇省南京市六合區人民法院審結一起撫養費糾紛案件&#xff0c;認定夫妻雙方在決定孩子教育事務上均存在責任&#xff0c;為保障臨近高考的未成年子女的切身利益&#xff0c;認定由夫妻雙方按比例承擔教育費。   2015年6月&#xff0c;李某與王某離婚&#xff0c;雙方之子小…

PCL 有序點云的法線估計(使用積分圖進行法線估計)

使用積分圖進行法線估計 一、概述1.1 概念1.2 有序點云與無序點云1.2.1 有序點云1.2.2 無序點云1.3 代碼講解二、代碼實現三、結果示例一、概述 1.1 概念 使用積分圖進行法線估計:計算一個有序點云的法線,注意該方法只適用于有序點云。 1.2 有序點云與無序點云 有序點云與無…

MySQL安裝時initializing database失敗

問題頁面&#xff1a; 解決方法&#xff1a; 1.勾選紅框中的選項&#xff1a; 2.將下圖紅框中全部改為英文&#xff1a; 然后一路next就可以了。

cs231n作業1——KNN

參考文章&#xff1a;assignment1——KNN KNN 測試時分別計算測試樣本和訓練集中的每個樣本的距離&#xff0c;然后選取距離最近的k個樣本的標簽信息來進行分類。 方法1&#xff1a;Two Loops for i in range(num_test):for j in range(num_train):dist X[i, :] - self.X…