C語言文件操作學習筆記:從基礎到實踐

在C語言的知識體系中,文件操作是極為關鍵的一環,它賦予了程序存儲和讀取外部數據的能力,對于開發各類實用程序至關重要。近期,借助課程的學習,我對C語言文件操作進行了系統且深入的學習,下面將我的學習心得和收獲進行分享。

目錄

一、文件操作基礎概念

(一)文件類型

(二)文件指針

二、文件的打開與關閉

三、文件的順序讀寫

(一)字符讀寫

(二)文本行讀寫

(三)格式化讀寫

(四)二進制讀寫

四、文件的隨機讀寫

(一)?fseek?函數

(二)?rewind?函數

(三)?ftell?函數

五、學習感悟


一、文件操作基礎概念

(一)文件類型

文件主要分為程序文件數據文件。程序文件涵蓋了可執行代碼等內容,是程序運行的基礎;數據文件則肩負著存儲程序運行時所需處理或讀取的數據的重任,常見的有文本文件二進制文件文本文件以字符形式存儲數據便于人類閱讀和編輯二進制文件則以二進制格式存儲在存儲和讀取特定數據結構時效率更高。

(二)文件指針

在C語言中,?FILE*?類型的指針扮演著關鍵角色,它用于指向文件,是后續對文件進行各種操作的“橋梁”。例如:


?

cFILE* pf = fopen("data.txt", "r");

上述代碼中,?pf?就是指向名為?data.txt?文件的指針,?"r"?表示以只讀方式打開文件。通過這個指針,我們可以對文件進行讀取、寫入等一系列操作。


二、文件的打開與關閉

文件的打開和關閉是進行文件操作的基礎步驟。打開文件使用?fopen?函數,若成功執行,該函數會返回文件指針;若失敗,則返回?NULL?。因此,為了確保程序的健壯性,打開文件后必須進行錯誤判斷。示例如下:


?

c#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}// 文件操作代碼fclose(pf);pf = NULL;return 0;}

關閉文件時,我們需要使用?fclose?函數,并將文件指針置為?NULL?,這樣可以有效防止野指針的產生。另外,文件路徑的指定方式有絕對路徑和相對路徑。絕對路徑完整地指明了文件在系統中的位置,而相對路徑則是相對于當前工作目錄的位置描述,在實際應用中可根據具體情況靈活選擇。


三、文件的順序讀寫

(一)字符讀寫

?fgetc?函數用于從文件流中逐個讀取字符,?fputc?函數則用于向文件流中寫入字符。以下是一個向文件寫入26個英文字母的示例:


?

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "w");if (pf == NULL) {perror("fopen");return 1;}for (int i = 'a'; i <= 'z'; i++) {fputc(i, pf);}fclose(pf);pf = NULL;return 0;}

讀取文件中的字符示例:


?

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch;while ((ch = fgetc(pf)) != EOF) {printf("%c ", ch);}fclose(pf);pf = NULL;return 0;}

(二)文本行讀寫

?fgets?函數能夠讀取文本行,它會將讀取到的內容存儲到指定的字符數組中,并且會保留換行符(如果有)。?fputs?函數則用于輸出文本行到文件或標準輸出。示例如下:

c// 寫入文本行#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "w");if (pf == NULL) {perror("fopen");return 1;}char str[] = "Hello, world!\nThis is a test line.";fputs(str, pf);fclose(pf);pf = NULL;return 0;}


?

c// 讀取文本行#include <stdio.h>int main() {FILE* pf = fopen("test.txt", "r");if (pf == NULL) {perror("fopen");return 1;}char buffer[100];while (fgets(buffer, sizeof(buffer), pf) != NULL) {printf("%s", buffer);}fclose(pf);pf = NULL;return 0;}

(三)格式化讀寫

?fscanf??fprintf?函數類似于我們熟悉的?scanf?和?printf?不同之處在于它們是針對文件流進行格式化的輸入和輸出操作。例如,向文件中格式化寫入數據:


?

c#include <stdio.h>struct Student {char name[20];int age;};int main() {FILE* pf = fopen("students.txt", "w");if (pf == NULL) {perror("fopen");return 1;}struct Student s = {"Tom", 20};fprintf(pf, "Name: %s, Age: %d", s.name, s.age);fclose(pf);pf = NULL;return 0;}

從文件中格式化讀取數據:


?

c#include <stdio.h>struct Student {char name[20];int age;};int main() {FILE* pf = fopen("students.txt", "r");if (pf == NULL) {perror("fopen");return 1;}struct Student s;fscanf(pf, "Name: %s, Age: %d", s.name, &s.age);printf("Read: Name - %s, Age - %d\n", s.name, s.age);fclose(pf);pf = NULL;return 0;}

(四)二進制讀寫

?fread?和?fwrite?函數用于對文件進行二進制形式的讀寫,這在處理諸如結構體等復雜數據結構時非常實用。例如,將結構體數據以二進制形式寫入文件:

c#include <stdio.h>struct Point {int x;int y;};int main() {FILE* pf = fopen("points.bin", "wb");if (pf == NULL) {perror("fopen");return 1;}struct Point p = {10, 20};fwrite(&p, sizeof(struct Point), 1, pf);fclose(pf);pf = NULL;return 0;}

從二進制文件中讀取數據:

c#include <stdio.h>struct Point {int x;int y;};int main() {FILE* pf = fopen("points.bin", "rb");if (pf == NULL) {perror("fopen");return 1;}struct Point p;fread(&p, sizeof(struct Point), 1, pf);printf("Read: x - %d, y - %d\n", p.x, p.y);fclose(pf);pf = NULL;return 0;}

四、文件的隨機讀寫

(一)?fseek?函數

?fseek?函數允許我們根據給定的偏移量和起始位置來靈活定位文件指針例如,將文件指針從文件末尾向后退3個字節:

#include <stdio.h>
int main() {FILE* pf = fopen("data.txt", "r+");if (pf == NULL) {perror("fopen");return 1;}fseek(pf, -3, SEEK_END);// 后續操作fclose(pf);pf = NULL;return 0;
}

(二)?rewind?函數

?rewind?函數的作用十分簡潔明了,它能讓文件指針迅速回到文件的起始位置,這對于需要重新讀取文件內容的場景非常方便。示例如下:

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}// 讀取部分內容// 讓文件指針回到起始位置rewind(pf);fclose(pf);pf = NULL;return 0;}

(三)?ftell?函數

?ftell?函數可以獲取文件指針相對于起始位置的偏移量,這在需要了解當前讀取或寫入位置的情況下很有用。例如:

c#include <stdio.h>int main() {FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}// 讀取一些數據fgetc(pf);long offset = ftell(pf);printf("Current offset: %ld\n", offset);fclose(pf);pf = NULL;return 0;}

五、學習感悟

通過這段時間對C語言文件操作內容的學習,我對文件操作有了更為全面和深入的認識。從最基礎的文件打開與關閉,到多種類型的讀寫操作,再到隨機讀寫的靈活運用,每一個知識點都相互關聯,構成了一個完整的知識體系。

在實際編寫代碼的過程中,我也遇到了不少挑戰。比如,由于對文件指針的使用不夠熟練,導致程序出現錯誤;對某些讀寫函數的參數理解存在偏差,使得數據讀寫不符合預期。但通過不斷地調試代碼、查閱資料以及向老師和同學請教,這些問題都逐步得到了解決。

文件操作在實際項目中的應用場景極為廣泛,無論是數據的持久化存儲、配置文件的讀取,還是日志文件的記錄等,都離不開文件操作技術。因此,后續我還需要通過更多的實際項目和練習,來進一步熟練掌握這部分知識,提高自己在文件操作方面的編程能力,以便更好地應對未來開發工作中的各種需求。

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

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

相關文章

VLM-E2E:通過多模態駕駛員注意融合增強端到端自動駕駛

25年2月來自香港科大廣州分校、理想汽車和廈門大學的論文“VLM-E2E: Enhancing End-to-End Autonomous Driving with Multimodal Driver Attention Fusion”。 人類駕駛員能夠利用豐富的注意語義&#xff0c;熟練地應對復雜場景&#xff0c;但當前的自動駕駛系統難以復制這種能…

第十天-字符串:編程世界的文本基石

在編程的廣闊領域中&#xff0c;字符串是極為重要的數據類型&#xff0c;它就像一座橋梁&#xff0c;連接著人類的自然語言和計算機能夠理解與處理的數字信息。下面&#xff0c;讓我們深入探索字符串的世界。 一、字符串簡介 字符串是由零個或多個字符組成的有序序列&#xff…

《基于HarmonyOS NEXT API 12+,搭建新聞創作智能寫作引擎》

在信息爆炸的時代&#xff0c;新聞行業對于內容生產的效率和質量有著極高的要求。AI技術的發展為新聞創作帶來了新的變革契機&#xff0c;借助AI智能寫作助手&#xff0c;新聞工作者可以快速生成新聞稿件的初稿&#xff0c;大大提高創作效率。本文將基于HarmonyOS NEXT API 12及…

基于STM32的環境監測系統(自制藍牙APP)

目錄 項目概述 實物圖 演示視頻 概述 硬件模塊 原理圖以及PCB 0.96寸OLED屏幕&#xff08;SSD1306&#xff09; CubeMX配置 初始化代碼 MQ-2煙霧傳感器 CubeMX配置 初始化代碼 DHT11溫濕度模塊 驅動代碼 HC-05藍牙模塊 CubeMX配置 ?編輯 空閑中斷回調函數 有…

linux離線安裝ollama并部署deepseek-r1模型 指南

這篇文章主要分為兩部分&#xff1a; (1)離線環境下如何部署Ollama&#xff1b; (2)在離線環境下如何配置大模型&#xff0c;其中這一步又分為&#xff1a; ?1)部署完整的deepseek大模型&#xff0c;如&#xff1a;deepseek-r1:32B; ?2)部署蒸餾版模型&#xff0c;如&#xf…

坐標變換介紹與機器人九點標定的原理

【備注】本文的C#代碼在下面鏈接中可以下載:Opencv的C#九點標定代碼資源-CSDN文庫 https://download.csdn.net/download/qq_34047402/90452336 一、坐標變換的介紹 1.繞原點旋轉的坐標變換 一個點(x,y)繞原點旋轉u度,其旋轉后的坐標(x1,y1)如何計算? 2.繞任意點的坐標變…

大語言模型 智能助手——既能生成自然語言回復,又能在必要時調用外部工具獲取實時數據

示例代碼&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…

FPGA學習(一)——DE2-115開發板編程入級

FPGA學習&#xff08;一&#xff09;——DE2-115開發板編程入級 一、實驗目的 通過 1 位全加器的詳細設計&#xff0c;深入掌握原理圖輸入以及 Verilog 的兩種設計方法&#xff0c;熟悉 Quartus II 13.0 軟件的使用流程&#xff0c;以及在 Intel DE2-115 開發板上的硬件測試過…

中間件專欄之MySQL篇——MySQL事務原理、鎖機制分析

MySQL的事務性也是其重要特性之一。 什么是事務&#xff1a;事務的本質是并發控制的單元&#xff0c;是用戶定義的一個操作序列。這些操作要么都做&#xff0c;要么都不做&#xff0c;是 一個不可分割的工作單位。 目的&#xff1a;事務的目的在于將數據庫從一種一致性狀態轉…

機器學習的三個基本要素

機器學習的基本要素包括模型、學習準則&#xff08;策略&#xff09;和優化算法三個部分。機器學習方法之間的不同&#xff0c;主要來自其模型、學習準則&#xff08;策略&#xff09;、優化算法的不同。 模型 機器學習首要考慮的問題是學習什么樣的模型&#xff08;Model&am…

集成方案 | Docusign 能與哪些應用程序集成?

如何實現 Docusign 與多種系統平臺之間的高效集成&#xff1f; 在企業跨境簽約場景中&#xff0c;員工常常需要在電子簽系統與辦公應用&#xff08;如釘釘、企業微信&#xff09;、CRM、ERP 等系統之間來回切換&#xff0c;手動上傳合同、下載簽署文件并同步數據。這種繁瑣的操…

2025華為OD機試真題目錄【E卷+A卷+B卷+C卷+D卷】持續收錄中...

摘要 本專欄提供2025最新最全的華為OD機試真題庫&#xff08;EABCD卷&#xff09;&#xff0c;包括100分和200分題型。題目包含題目描述、輸入描述、用例、備注和解題思路、多種語言解法&#xff08;Java/JS/Py/C/C&#xff09;。希望小伙伴們認真學習、順利通過。 聲明 本專…

廣域互聯網關鍵技術詳解(GRE/LSTP/IPsec/NAT/SAC/SPR)

《廣域互聯網關鍵技術詳解》屬于博主的“廣域網”專欄&#xff0c;若想成為HCIE&#xff0c;對于廣域網相關的知識需要非常了解&#xff0c;更多關于廣域網的內容博主會更新在“廣域網”專欄里&#xff0c;請持續關注&#xff01; 一.前言 廣域互聯技術紛雜多樣&#xff0c;不…

AF3 _correct_post_merged_feats函數解讀

AlphaFold3 msa_pairing 模塊的 _correct_post_merged_feats 函數用于對合并后的特征進行修正,確保它們符合預期的格式和要求。這包括可能的對特征值進行調整或進一步的格式化,確保合并后的 FeatureDict 適合于后續模型的輸入。 主要作用是: 在多鏈蛋白質 MSA(多序列比對)…

Docker 學習(三)——數據管理

容器中的管理數據主要有兩種方式&#xff1a; 數據卷 &#xff08;Data Volumes&#xff09;&#xff1a; 容器內數據直接映射到本地主機環境&#xff1b; 數據 卷容器&#xff08; Data Volume Containers&#xff09;&#xff1a; 使用特定容器維護數據卷 1.數據卷 數據卷…

基于SSM+Vue+uniapp的考研交流(帶商城)小程序+LW示例參考

系列文章目錄 1.基于SSM的洗衣房管理系統原生微信小程序LW參考示例 2.基于SpringBoot的寵物攝影網站管理系統LW參考示例 3.基于SpringBootVue的企業人事管理系統LW參考示例 4.基于SSM的高校實驗室管理系統LW參考示例 5.基于SpringBoot的二手數碼回收系統原生微信小程序LW參考示…

2025-03-04 學習記錄--C/C++-PTA 練習5-3 字符金字塔

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、題目描述 ?? 二、解題步驟 ?? 第1步、把字符和一個空格看作整體&#xff0c;即"G_"&#xff1b; 第2步、外…

DeepSeek集成到VScode工具,讓編程更高效

DeepSeek與VScode的強強聯合&#xff0c;為編程效率樹立了新標桿。 DeepSeek&#xff0c;一款卓越的代碼搜索引擎&#xff0c;以其精準的索引和高速的檢索能力&#xff0c;助力開發者在浩瀚的代碼海洋中迅速定位關鍵信息。 集成至VScode后&#xff0c;開發者無需離開熟悉的編輯…

前端-css(預編譯器sass)

1.sass(scss->sass第三代) Sass3 -> Scss(Sassy CSS),SCSS(Sassy CSS) 是 CSS 語法的擴展. 2.scss注釋 Sass 支持標準的 CSS 多行注釋 /* */&#xff0c;以及單行注釋 //&#xff0c;前者會 被完整輸出到編譯后的 CSS 文件中&#xff0c;而后者則不會 3.scss定義變量 …

【計算機網絡入門】初學計算機網絡(十一)重要

目錄 1. CIDR無分類編址 1.1 CIDR的子網劃分 1.1.1 定長子網劃分 1.1.2 變長子網劃分 2. 路由聚合 2.1 最長前綴匹配原則 3. 網絡地址轉換NAT 3.1 端口號 3.2 IP地址不夠用&#xff1f; 3.3 公網IP和內網IP 3.4 NAT作用 4. ARP協議 4.1 如何利用IP地址找到MAC地址…