Linux文件編程——標準庫函數fopen、fread、fwrite等函數

1. fopen — 打開文件

函數原型:
FILE *fopen(const char *filename, const char *mode);
參數:
  • filename:要打開的文件名,可以是相對路徑或絕對路徑。

  • mode:文件打開模式,表示文件的操作方式(如只讀、寫入、追加等)。

常見的打開模式:
  • "r":只讀模式,文件必須存在。

  • "w":只寫模式,如果文件存在會清空文件,不存在則創建。

  • "a":追加模式,文件不存在則創建,寫入時數據會追加到文件末尾。

  • "r+":讀寫模式,文件必須存在。

  • "w+":讀寫模式,文件存在則清空,不存在則創建。

  • "a+":讀寫模式,文件不存在則創建,數據追加到文件末尾。

返回值:
  • 如果成功,返回一個指向文件的指針(FILE *)。

  • 如果失敗,返回 NULL,通常使用 perror()errno 獲取錯誤信息。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("無法打開文件");return 1;
}
注意事項:
  • fopen 只支持文本文件和二進制文件的打開,打開方式非常靈活,可以通過不同的模式選擇合適的文件操作。

  • 打開文件后,應確保及時關閉文件,使用 fclose()

  • fopen 函數會自動創建文件指針,并為文件分配緩沖區。


2. fread — 從文件讀取數據

函數原型:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
參數:
  • ptr:指向要存儲讀取數據的內存緩沖區。

  • size:每個元素的字節數(通常為 sizeof(type))。

  • count:要讀取的元素數量。

  • stream:文件指針,表示要讀取的文件。

返回值:
  • 返回實際讀取的元素數量。如果返回值小于 count,表示可能發生了錯誤或到達了文件末尾(EOF)。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("無法打開文件");return 1;
}char buffer[100];
size_t bytesRead = fread(buffer, sizeof(char), sizeof(buffer), fp);
if (bytesRead > 0) {printf("讀取到的內容: %s\n", buffer);
}
fclose(fp);
注意事項:
  • fread 是基于緩沖區的讀取,性能較高,適合讀取大塊數據。

  • 讀取時要確保 ptr 的內存空間足夠容納讀取的數據。

  • fread 適用于二進制數據的讀取。如果是讀取文本數據,最好使用 fgets

  • fread 讀取時并不會自動添加字符串終止符 \0,如果讀取的是字符串,需手動添加。


3. fwrite — 向文件寫入數據

函數原型:
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);
參數:
  • ptr:指向要寫入的數據的內存緩沖區。

  • size:每個元素的字節數(通常為 sizeof(type))。

  • count:要寫入的元素數量。

  • stream:文件指針,表示要寫入的文件。

返回值:
  • 返回實際寫入的元素數量。如果返回值小于 count,表示可能發生了錯誤。

示例:
FILE *fp = fopen("output.txt", "w");
if (fp == NULL) {perror("無法打開文件");return 1;
}const char *data = "Hello, World!";
size_t bytesWritten = fwrite(data, sizeof(char), strlen(data), fp);
if (bytesWritten != strlen(data)) {perror("寫入文件失敗");
}
fclose(fp);
注意事項:
  • fwrite 會自動使用緩沖區,提高性能。

  • 使用 fwrite 時應確保數據類型和緩沖區大小正確。通常用于寫入二進制數據。

  • fwrite 也不會在寫入的數據末尾自動添加字符串結束符 \0,需根據實際需求手動處理。


4. fseek — 設置文件指針的位置

函數原型:
int fseek(FILE *stream, long int offset, int whence);
參數:
  • stream:文件指針。

  • offset:從 whence 指定的起始位置開始的偏移量。

  • whence:起始位置的標志,常用的值包括:

    • SEEK_SET:文件開頭。

    • SEEK_CUR:當前位置。

    • SEEK_END:文件末尾。

返回值:
  • 成功時返回 0,失敗時返回非零值。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("無法打開文件");return 1;
}fseek(fp, 0, SEEK_END);  // 定位到文件末尾
long fileSize = ftell(fp);  // 獲取文件大小
printf("文件大小: %ld 字節\n", fileSize);fseek(fp, 0, SEEK_SET);  // 重置文件指針到文件開頭
fclose(fp);
注意事項:
  • fseek 可以改變文件指針的位置,在讀取或寫入時可以靈活地控制文件位置。

  • fseekftell 配合使用,能夠實現文件大小的獲取。

  • 使用時要注意文件是否已正確打開,并且文件指針的偏移量是否合理。


5. fclose — 關閉文件

函數原型:
int fclose(FILE *stream);
參數:
  • stream:要關閉的文件指針。

返回值:
  • 成功時返回 0,失敗時返回 EOF。

示例:
FILE *fp = fopen("example.txt", "r");
if (fp == NULL) {perror("無法打開文件");return 1;
}fclose(fp);  // 關閉文件
注意事項:
  • 必須關閉文件:每次打開文件后,使用完文件后必須調用 fclose() 關閉文件,釋放資源。

  • fclose() 會刷新文件的緩沖區,如果有未寫入的數據,會被強制寫入文件。

  • 在程序結束時忘記關閉文件可能會導致內存泄漏或資源占用。


6. fputc — 向文件寫入一個字符

函數原型:
int fputc(int character, FILE *stream);
參數:
  • character:要寫入的字符。注意,這里傳入的是一個整數類型(通常是 char 的 ASCII 值),而不是字符本身,因此需要使用字符類型轉換。

  • stream:文件指針,指向目標文件。

返回值:
  • 如果寫入成功,返回寫入的字符(轉換為 unsigned char)。

  • 如果寫入失敗,返回 EOF

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "w");if (fp == NULL) {perror("無法打開文件");return 1;}fputc('H', fp);  // 向文件中寫入字符 'H'fputc('i', fp);  // 向文件中寫入字符 'i'fclose(fp);  // 關閉文件return 0;
}
注意事項:
  • fputc 只能寫入單個字符。寫入多個字符時,需要多次調用 fputc

  • fputc 寫入時不會自動添加換行符,必須手動寫入(如 fputc('\n', fp))。

  • 如果寫入過程中發生錯誤,fputc 返回 EOF,可以通過 perror 或檢查文件指針的狀態進行處理。


7. fgetc — 從文件讀取一個字符

函數原型:
int fgetc(FILE *stream);
參數:
  • stream:文件指針,指向要讀取的文件。

返回值:
  • 成功時,返回讀取的字符(以 unsigned char 形式返回,但作為 int 類型)。

  • 如果讀取到文件結束符(EOF),返回 EOF

  • 如果發生讀取錯誤,也會返回 EOF

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {perror("無法打開文件");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {  // 逐個字符讀取文件內容putchar(ch);  // 輸出字符}fclose(fp);  // 關閉文件return 0;
}
注意事項:
  • fgetc 一次讀取一個字符,適用于逐字符讀取文件。

  • 在讀取時,fgetc 會返回字符的 ASCII 值。如果遇到文件結束符(EOF),則停止讀取。

  • 使用 fgetc 時要注意檢查返回值,EOF 可能意味著文件結束或讀取錯誤,因此應及時檢查并處理。


8. feof — 檢查是否到達文件末尾

函數原型:
int feof(FILE *stream);
參數:
  • stream:文件指針,指向要檢查的文件。

返回值:
  • 如果文件指針已到達文件末尾,返回非零值(通常是 1)。

  • 如果文件指針尚未到達文件末尾,返回 0

示例:
#include <stdio.h>int main() {FILE *fp = fopen("example.txt", "r");if (fp == NULL) {perror("無法打開文件");return 1;}int ch;while ((ch = fgetc(fp)) != EOF) {putchar(ch);  // 輸出字符}if (feof(fp)) {printf("\n已到達文件末尾。\n");}fclose(fp);  // 關閉文件return 0;
}
注意事項:
  • feof 在文件讀取時用來檢查是否已到達文件末尾,它不會主動讀取文件內容,因此最好在文件讀取后使用(如通過 fgetcfread 等函數)。

  • 不要在 fgetcfread 等讀取函數調用前檢查 feof,因為 feof 只能判斷是否到達文件末尾,而不是預測讀取是否成功。正確的做法是在讀取失敗或讀取結束后再檢查 feof

總結

  • fopen:用于打開文件,返回文件指針,可以設置文件的打開模式。

  • fread:用于從文件中讀取數據,適用于讀取二進制數據。

  • fwrite:用于將數據寫入文件,適用于寫入二進制數據。

  • fseek:用于設置文件指針的位置,可以在文件內部進行定位。

  • fclose:關閉文件,釋放資源,確保數據寫入完成。

  • fputc:用于寫入單個字符,適合逐個字符地寫入文件。如果要寫入多個字符,可以多次調用 fputc,或者使用 fwrite

  • fgetc:用于讀取單個字符。返回值是一個 int 類型,用于區分普通字符與 EOF(文件結束符)。

  • feof:用于檢查文件是否已到達末尾,但不能在讀取文件時直接判斷文件是否結束。通常在文件讀取結束后,檢查 feof 是否為真,來判斷是否到達文件末尾。

使用注意事項:

  1. 每次打開文件后,必須使用 fclose() 關閉文件,防止資源泄漏。

  2. freadfwrite 操作時不會自動添加字符串結束符 \0,需要手動處理。

  3. 對于文本文件,使用 fopenfreadfwrite 等標準庫函數進行文件操作,適用于大多數應用場景;對于高效、底層的文件操作,可以使用 openreadwrite 等系統調用。

  4. 調用 fseek 時要確保文件指針在有效范圍內。

  5. fgetc讀取文件時,要根據返回值判斷是否讀取到文件結束。

  6. feof 僅用于檢測文件末尾,而不是讀取是否成功。建議在 fgetcfread 讀取后檢查 feof

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

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

相關文章

從 Git 到 GitHub - 使用 Git 進行版本控制 - Git 常用命令

希望本貼能從零開始帶您一起學習如何使用 Git 進行版本控制&#xff0c;并結合遠程倉庫 GitHub。這會是一個循序漸進的指南&#xff0c;我們開始吧&#xff01; 學習 Git 和 GitHub 的路線圖&#xff1a; 理解核心概念&#xff1a;什么是版本控制&#xff1f;Git 是什么&…

2025.05.11拼多多機考真題算法崗-第四題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍OJ 04. 記憶碎片重組 問題描述 盧小姐正在開發一款名為"記憶碎片"的游戲,玩家需要分析混亂的記憶數據,推測出形成這些記憶的原始序列。游戲中,記憶數據存儲在一個特殊的數…

Android Exoplayer多路不同時長音視頻混合播放

在上一篇Android Exoplayer 實現多個音視頻文件混合播放以及音軌切換中我們提到一個問題&#xff0c;如果視頻和音頻時長不一致&#xff0c;特別是想混合多個音頻和多個視頻時就會出問題&#xff0c;無法播放。報錯如下&#xff1a; E/ExoPlayerImplInternal(11191): Playback…

Datawhale PyPOTS時間序列5月第1次筆記

課程原地址&#xff1a; https://github.com/WenjieDu/PyPOTS&#xff08;Package地址&#xff09; https://github.com/WenjieDu/BrewPOTS/tree/datawhale/202505_datawhale&#xff08;Tutorial地址&#xff09; 2.1 PyPOTS簡介 PyPOTS 是一個專為處理部分觀測時間序列&a…

網安學途—流量分析 attack.pcap

attack.pacp 使用Wireshark查看并分析虛擬機windows 7桌面下的attack.pcapng數據包文件&#xff0c;通過分析數據包attack.pcapng找出黑客的IP地址&#xff0c;并將黑客的IP地址作為FLAG &#xff08;形式&#xff1a;[IP地址]&#xff09;提交&#xff1a; 過濾器篩選&#x…

【大模型】DeepResearcher:通用智能體通過強化學習探索優化

DeepResearcher&#xff1a;通過強化學習在真實環境中擴展深度研究 一、引言二、技術原理&#xff08;一&#xff09;強化學習與深度研究代理&#xff08;二&#xff09;認知行為的出現&#xff08;三&#xff09;模型架構 三、實戰運行方式&#xff08;一&#xff09;環境搭建…

go語言實現IP歸屬地查詢

效果: 實現代碼main.go package mainimport ("encoding/json""fmt""io/ioutil""net/http""os" )type AreaData struct {Continent string json:"continent"Country string json:"country"ZipCode …

基于STM32、HAL庫的SGTL5000XNLA3R2音頻接口芯片驅動程序設計

一、簡介: SGTL5000XNLA3R2 是 Cirrus Logic 推出的高性能、低功耗音頻編解碼器,專為便攜式和電池供電設備設計。它集成了立體聲 ADC、DAC、麥克風前置放大器、耳機放大器和數字信號處理功能,支持 I2S/PCM 音頻接口和 I2C 控制接口,非常適合與 STM32 微控制器配合使用。 二…

window 顯示驅動開發-報告圖形內存(一)

計算圖形內存 在 VidMm 能夠向客戶端報告準確的帳戶之前&#xff0c;它必須首先計算圖形內存的總量。 VidMm 使用以下內存類型和公式來計算圖形內存&#xff1a; 系統總內存 此值是操作系統可訪問的系統內存總量。 BIOS 分配的內存不會出現在此數字中。 例如&#xff0c;一臺…

[FA1C4] 博客鏈接

Blog Link 博客已經從 CSDN 轉移 高情商&#xff1a;博客是給人看的 低情商&#xff1a;CSDN 已經爛了根本不能看 鏈接: https://fa1c4.github.io/

python通過curl訪問deepseek的API調用案例

廢話少說&#xff0c;開干&#xff01; API申請和充值 下面是deepeek的API網站 https://platform.deepseek.com/ 進去先注冊&#xff0c;是不是手機賬號密碼都不重要&#xff0c;都一樣&#xff0c;完事充值打米&#xff0c;主要是打米后左側API Keys里面創建一個API Keys&am…

【計算機視覺】OpenCV項目實戰:基于face_recognition庫的實時人臉識別系統深度解析

基于face_recognition庫的實時人臉識別系統深度解析 1. 項目概述2. 技術原理與算法設計2.1 人臉檢測模塊2.2 特征編碼2.3 相似度計算 3. 實戰部署指南3.1 環境配置3.2 數據準備3.3 實時識別流程 4. 常見問題與解決方案4.1 dlib安裝失敗4.2 人臉檢測性能差4.3 誤識別率高 5. 關鍵…

第6章: SEO與交互指標

第6章: SEO與交互指標 在當今的SEO環境中&#xff0c;Google越來越重視用戶交互指標&#xff0c;如頁面停留時長、交互性能等。本章將深入探討如何優化網頁速度和用戶交互體驗&#xff0c;以提升SEO效果和用戶滿意度。 1. Google的新時代SEO指標 隨著互聯網技術的發展&#xff…

Starrocks的主鍵表涉及到的MOR Delete+Insert更新策略

背景 寫這個文章的作用主要是做一些總結和梳理&#xff0c;特別是正對大數據場景下的實時寫入更新策略 COW 和 MOR 以及 DeleteInsert 的技術策略的演進&#xff0c; 這也適用于其他大數據的計算存儲系統。該文章主要參考了Primary Key table. 分析總結 Starrocks 的主鍵表主…

C 語言_常見排序算法全解析

排序算法是計算機科學中的基礎內容,本文將介紹 C 語言中幾種常見的排序算法,包括實現代碼、時間復雜度分析、適用場景和詳細解析。 一、冒泡排序(Bubble Sort) 基本思想:重復遍歷數組,比較相鄰元素,將較大元素交換到右側。 代碼實現: void bubbleSort(int arr[], i…

JIT+Opcache如何配置才能達到性能最優

首先打開php.ini文件&#xff0c;進行配置 1、OPcache配置 ; 啟用OPcache opcache.enable1; CLI環境下啟用OPcache&#xff08;按需配置&#xff09; opcache.enable_cli0; 預加載腳本&#xff08;PHP 7.4&#xff0c;加速常用類&#xff09; ; opcache.preload/path/to/prel…

Python訓練打卡Day23

機器學習管道 pipeline 基礎概念 pipeline在機器學習領域可以翻譯為“管道”&#xff0c;也可以翻譯為“流水線”&#xff0c;是機器學習中一個重要的概念。 在機器學習中&#xff0c;通常會按照一定的順序對數據進行預處理、特征提取、模型訓練和模型評估等步驟&#xff0c;以…

GPU SIMT架構的極限壓榨:PTX匯編指令級并行優化實踐

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生專屬優惠。 一、SIMT架構的調度哲學與寄存器平衡藝術 1.1 Warp Scheduler的調度策略解構 在NVIDIA GPU…

HarmonyOS 【詩韻悠然】AI古詩詞賞析APP開發實戰從零到一系列(二、項目準備與后臺服務搭建)

在開發一款面向HarmonyOS平臺的應用程序——【詩韻悠然】AI古詩詞賞析APP時&#xff0c;選擇了流行Go語言作為后端開發語言&#xff0c;并使用了go-zero微服務框架來搭建服務接口。本文將詳細介紹項目準備和后臺服務搭建的過程&#xff0c;幫助大家更好地理解和掌握go-zero框架…

QT5.14安裝以及新建基礎項目

進入qt中文網站&#xff1a;Qt | 軟件開發全周期的各階段工具 額&#xff0c;考慮新手可能還是找不到&#xff0c;我就分享一下我下載的的吧 通過網盤分享的文件&#xff1a;qt-opensource-windows-x86-5.14.2.exe 鏈接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…