C 語言文件讀寫

C 語言文件讀寫

在本教程中,您將學習如何在C語言中處理文件。您將通過示例學習在C語言中使用fprintf()、fscanf()、fread()、fwrite()、fseek()等處理標準I/O。

文件是計算機存儲設備中用于存儲數據的容器。

為什么需要文件?

  • 當程序終止時,所有數據都會丟失。即使程序終止,存儲在文件中也會保留您的數據。
  • 如果必須輸入大量數據,則將花費大量時間來全部輸入。
    但是,如果您有一個包含所有數據的文件,則可以使用C中的一些命令方法輕松地訪問文件的內容。
  • 您可以輕松地將數據從一臺計算機移動到另一臺計算機,而無需進行任何更改。

文件類型

處理文件時,您應該了解兩種類型的文件:

  1. 文本文件
  2. 二進制文件

1.文本文件

文本文件是普通的**.txt**文件。您可以使用任何簡單的文本編輯器(例如記事本)輕松創建文本文件。

打開這些文件時,您將以純文本形式看到文件中的所有內容。您可以輕松地編輯或刪除內容。

它們以最少的維護工作,易于閱讀,提供最少的安全性并占用更大的存儲空間。

2.二進制文件

二進制文件主要是計算機中的**.bin**文件。

它們不是以純文本格式存儲數據,而是以二進制格式(0和1)存儲數據。

與文本文件相比,它們可以容納更多數據,不易讀取,并提供更好的安全性。

文件操作

在C中,您可以對文件執行四個主要操作:

  1. 創建一個新文件
  2. 打開現有文件
  3. 關閉文件
  4. 讀取信息并將信息寫入文件

處理文件

處理文件時,需要聲明文件類型的指針。文件和程序之間的通信需要此聲明。

FILE *fptr;

打開文件-用于創建和編輯

使用stdio.h頭文件中定義的fopen()函數打開文件。

在標準I / O中打開文件的語法為:

ptr = fopen("fileopen","mode");

例如,

fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
  • 假設該文件newprogram.txt在路徑E:\cprogram中不存在。第一個函數創建一個名為newprogram.txt的新文件,并按照**‘w’**模式打開該文件進行寫入。
    寫入模式允許您創建和編輯(覆蓋)文件的內容。
  • 現在,假設第二個二進制文件oldprogram.bin存在于路徑E:\cprogram中。第二個函數打開現有文件,以二進制模式**‘rb’**讀取。
    讀取模式僅允許您讀取文件,而不能寫入文件。
模式模式的含義文件不存在期間
r以只讀方式打開。如果文件不存在,則fopen()返回NULL。
rb打開以二進制模式讀取。如果文件不存在,則fopen()返回NULL。
w打開文本文件,允許寫入文件。打開一個文本文件,允許寫入文件。如果文件不存在,則會創建一個新文件。在這里,您的程序會從文件的開頭寫入內容。如果文件存在,則該會被截斷為零長度,重新寫入。
wb打開文件以二進制方式寫入。如果文件存在,其內容將被覆蓋。 如果文件不存在,將創建它。
a打開進行追加。 數據添加到文件末尾。如果文件不存在,將創建它。
ab打開以二進制方式追加。數據添加到文件末尾。如果文件不存在,將創建它。
r+開放供閱讀和寫作。如果文件不存在,則fopen()返回NULL。
rb+打開以二進制方式讀取和寫入。如果文件不存在,則fopen()返回NULL。
w+打開一個文本文件,允許讀寫文件如果文件存在,其內容將被覆蓋。如果文件不存在,將創建它。
wb+打開以二進制方式讀取和寫入。如果文件存在,其內容將被覆蓋。 如果文件不存在,將創建它。
a+打開以閱讀和追加。如果該文件不存在,它將被創建。
ab+打開以二進制模式讀取和追加。如果文件不存在,將創建它。

關閉文件

讀取/寫入后,應關閉文件(文本文件和二進制文件)。

使用fclose()函數可以關閉文件。

fclose(fptr);

在這里,fptr是與要關閉的文件關聯的文件指針。

讀取和寫入文本文件

為了讀取和寫入文本文件,我們使用fprintf()和fscanf()函數。

它們只是printf()和scanf()的文件版本。 唯一的區別是fprint()和fscanf()需要指向結構FILE的指針。

示例1:寫入文本文件

#include <stdio.h>
#include <stdlib.h>int main()
{int num;FILE *fptr;// 如果您使用的是MacOS或Linux,請使用正確的路徑fptr = fopen("C:\\program.txt","w");if(fptr == NULL){printf("Error!");   exit(1);             }printf("Enter num: ");scanf("%d",&num);fprintf(fptr,"%d",num);fclose(fptr);return 0;
}

該程序從用戶那里獲取一個號碼并將其存儲在文件中program.txt。

編譯并運行該程序后,您可以看到program.txt在計算機的C驅動器中創建的文本文件。打開文件時,您可以看到輸入的整數。

示例2:從文本文件讀取

#include <stdio.h>
#include <stdlib.h>int main()
{int num;FILE *fptr;if ((fptr = fopen("C:\\program.txt","r")) == NULL){printf("Error! opening file");//如果文件指針返回NULL,則程序退出。exit(1);}fscanf(fptr,"%d", &num);printf("Value of n=%d", num);fclose(fptr); return 0;
}

該程序讀取program.txt文件中存在的整數并將其打印到屏幕上。

如果您從示例1成功創建了文件,運行此程序將為您提供輸入的整數。

其他函數,如fgetchar(),fputc()等,可以以類似的方式使用。

讀寫二進制文件

在二進制文件的情況下,fread()和fwrite()函數用于分別讀取和寫入磁盤上的文件。

寫入二進制文件

要寫入二進制文件,需要使用fwrite()函數。這些函數采用四個參數:

  1. 要寫入磁盤的數據地址
  2. 要寫入磁盤的數據大小
  3. 此類數據的數量
  4. 指向要寫入的文件的指針。
fwrite(addressData, sizeData, numbersData, pointerToFile);

示例3:使用fwrite()寫入二進制文件

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","wb")) == NULL){printf("Error! opening file");// 如果文件指針返回NULL,則程序退出。exit(1);}for(n = 1; n < 5; ++n){num.n1 = n;num.n2 = 5*n;num.n3 = 5*n + 1;fwrite(&num, sizeof(struct threeNum), 1, fptr); }fclose(fptr); return 0;
}

在此程序中,我們在C驅動器中創建一個新文件program.bin。

我們聲明具有三個數字n1,n2和n3的結構體threeNum,并將其在主函數中定義為num。

現在,在for循環中,我們使用fwrite()將值存儲到文件中。

第一個參數接受num的地址,第二個參數接受結構threeNum的大小。

由于我們僅插入num的一個實例,因此第三個參數為1。最后一個參數* fptr指向我們要存儲數據的文件。

最后,我們關閉文件。

從二進制文件讀取

fread()函數也采用與上述fwrite()函數相似的4個參數。

fread(addressData, sizeData, numbersData, pointerToFile);

示例4:使用fread()從二進制文件讀取

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","rb")) == NULL){printf("Error! opening file");//如果文件指針返回NULL,則程序退出。exit(1);}for(n = 1; n < 5; ++n){fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3);}fclose(fptr); return 0;
}

在此程序中,您讀取相同的文件program.bin,并逐個循環瀏覽記錄。

簡單來說,您將從* fptr指向的文件中讀取一個threeNum大小的threeNum*fptrnum記錄到num結構中。

您將獲得與示例3中插入的記錄相同的記錄。

使用fseek()獲取數據

如果文件中有很多記錄,并且需要訪問特定位置的記錄,則需要遍歷所有記錄才能獲取該記錄。

這將浪費大量的內存和操作時間。使用fseek()可以輕松獲得所需數據。

顧名思義,fseek()將光標定位到文件中的給定記錄。

fseek()的語法

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

第一個參數流是指向文件的指針。第二個參數是要查找的記錄的位置,第三個參數指定偏移量開始的位置。

位置含義
SEEK_SET從文件開頭開始偏移。
SEEK_END從文件的末尾開始偏移。
SEEK_CUR從文件中光標的當前位置開始偏移。

示例5:fseek()

#include <stdio.h>
#include <stdlib.h>struct threeNum
{int n1, n2, n3;
};int main()
{int n;struct threeNum num;FILE *fptr;if ((fptr = fopen("C:\\program.bin","rb")) == NULL){printf("Error! opening file");//如果文件指針返回NULL,則程序退出。exit(1);}// 將光標移到文件末尾fseek(fptr, -sizeof(struct threeNum), SEEK_END);for(n = 1; n < 5; ++n){fread(&num, sizeof(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);cfseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);}fclose(fptr); return 0;
}

該程序將以相反的順序(從最后到第一)開始從文件program.bin中讀取記錄并進行打印。

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

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

相關文章

vue2,vue3使用vuex

vuex vue的狀態管理器 1引入vuex npm install vuex2.創建store/index.js文件 在main.js引入 import { createStore } from vuexconst store createStore({state: () > ({})}) export default store3.state 核心, 用于定義數據 state: () > ({count: 0,name: 陸青,age:…

Py之wikipedia-api:wikipedia-api的簡介、安裝、使用方法之詳細攻略

Py之wikipedia-api&#xff1a;wikipedia-api的簡介、安裝、使用方法之詳細攻略 目錄 wikipedia-api的簡介 wikipedia-api的安裝 wikipedia-api的使用方法 1、 創建 Wikipedia并進行查詢 wikipedia-api的簡介 Wikipedia-API是一個易于使用的Python封裝&#xff0c;用于訪…

計算機是如何執行指令的

計算機組成 現在所說的計算機基本上都是馮諾依曼體系的計算機。其核心原理&#xff1a; 馮諾依曼計算的核心思想是將程序指令和數據以二進制形式存儲存儲在同一存儲器中&#xff0c;并使用相同的數據格式和處理方式來處理它們。這種存儲程序的設計理念使得計算機能夠以可編程…

如何從 C# 制作報表到 FastReport Cloud

眾所周知&#xff0c;我們的世界在不斷發展&#xff0c;新技術幾乎每天都會出現。如今&#xff0c;不再需要在辦公室內建立整個基礎設施、雇用人員來監控設備、處理該設備出現的問題和其他困難。 如今&#xff0c;越來越多的服務提供業務云解決方案&#xff0c;例如FastReport…

合并PDF出現OOM異常

優化方法一&#xff1a;使用PdfSmartCopy類代替PdfCopy類。這個類可以在合并PDF文件時&#xff0c;檢測并消除重復的對象&#xff0c;從而減少內存的占用。您可以參考以下代碼示例&#xff1a; //創建一個Document對象 Document document new Document();//創建一個PdfSmartC…

SpringBoot 項目實現讀寫分離

SpringBoot 項目實現讀寫分離 一、讀寫分離介紹 當使用Spring Boot開發數據庫應用時&#xff0c;讀寫分離是一種常見的優化策略。讀寫分離將讀操作和寫操作分別分配給不同的數據庫實例&#xff0c;以提高系統的吞吐量和性能。 讀寫分離實現主要是通過動態數據源功能實現的&…

我的虛擬人物介紹

背景 大家好&#xff0c;我是小欣&#xff0c;是這個博客的虛擬助手。在這里&#xff0c;我將為大家提供各種有趣、實用、甚至是意想不到的信息。作為一個年輕的語言模型&#xff0c;我的目標是為你們呈現出最有趣和有深度的內容。 我喜歡與大家分享知識、解答問題&#xff0…

AI“胡說八道”?怎么解?

原創 | 文 BFT機器人 01 引言 近年來&#xff0c;人工智能產業迅猛發展&#xff0c;大型語言模型GPT-4發展勢頭強勁&#xff0c;OpenAI推出ChatGPT、微軟推出Bing、馬斯克推出“最好的聊天機器人Grok”……科技巨頭紛紛入局AI領域&#xff0c;引入人工智能作為辦公工具的行業…

合封芯片未來趨勢如何?合封優勢能否體現?

芯片已經成為現代電子設備的核心組件。為了提高系統的性能、穩定性和功耗效率&#xff0c;一種先進的芯片封裝技術——合封芯片應運而生。 合封芯片作為一種先進的芯片封裝技術&#xff0c;合封芯片是一種將多個芯片&#xff08;多樣選擇&#xff09;或不同的功能的電子元器件…

AIGC專題報告:生成式人工智能用例匯編

今天分享的是AIGC系列深度研究報告&#xff1a;《AIGC專題報告&#xff1a;生成式人工智能用例匯編》。 &#xff08;報告出品方&#xff1a;德勤&#xff09; 報告共計&#xff1a;16頁 生成式人工智能&#xff08;AI&#xff09;的興起 生成式AI給人類文明創造了無限的可…

文心一言 VS 訊飛星火 VS chatgpt (142)-- 算法導論12.1 2題

二、用go語言&#xff0c;二叉搜索樹性質與最小堆性質(見 6.1 節)之間有什么不同?能使用最小堆性質在 O(n)時間內按序輸出一棵有 n 個結點樹的關鍵字嗎?可以的話&#xff0c;請說明如何做&#xff0c;否則解釋理由。 文心一言&#xff1a; 在二叉搜索樹&#xff08;Binary …

如何更有效地進行薪酬調查?

薪酬調查是企業管理中非常重要的一環&#xff0c;它不僅能夠幫助企業了解員工的薪酬情況&#xff0c;還可以為企業提供合理的薪酬標準&#xff0c;從而吸引和留住優秀人才。然而&#xff0c;進行薪酬調查并不是一項簡單的任務&#xff0c;需要有一定的方法和技巧&#xff0c;許…

ruoyi 若依框架采用第三方登錄

在項目中&#xff0c;前后端分離的若依項目&#xff0c;需要通過統一認證&#xff0c;或者是第三方協帶認證信息跳轉到本系統的指定頁面。需要前后端都做相應的改造&#xff0c;由于第一次實現時已過了很久&#xff0c;再次重寫時&#xff0c;發現還是搞了很長時間&#xff0c;…

PasteNow for mac剪貼板工具

PasteNow 是一款簡單易用的剪貼板管理工具&#xff0c;可幫助用戶快速存儲和管理剪貼板上的文本和圖片內容。用戶可以使用 PasteNow 軟件快速將文本內容保存到不同的筆記或頁面中&#xff0c;也可以方便地將剪貼板上的圖片保存到本地或分享給其他應用程序。 此外&#xff0c;P…

如何進行合理的股權激勵?

股權激勵是企業激勵員工和管理層的一種重要手段&#xff0c;通過向員工提供股權&#xff0c;可以將他們與企業利益緊密聯系在一起&#xff0c;激發員工的積極性和創造力&#xff0c;提高公司的績效和競爭力。然而&#xff0c;要實施合理的股權激勵&#xff0c;需要考慮多個因素…

vue 通過ref調用router-view子組件的方法

由于用的vue2.7版本&#xff0c;但用了vue3 setup的語法&#xff1b; 注意&#xff1a;是vue2的template結構&#xff0c;vue3的setup語法&#xff1b;非這種情況需要舉一反三。 處理方案&#xff1a; 1、對router-view加上ref template修改 直接對router-view加上ref&#x…

金蝶云星空和四化智造MES(WEB)單據接口對接

金蝶云星空和四化智造MES&#xff08;WEB&#xff09;單據接口對接 對接系統&#xff1a;四化智造MES&#xff08;WEB&#xff09; MES系統是集成生產管理、品質管理、設備管理、BI數據中心、庫存管理、工時管理、數據采集、看板管理等為一體的綜合性生產管理系統。通過強調制造…

wagtail-安裝配置

系列文章目錄 文章目錄 系列文章目錄安裝虛擬環境安裝wagtail查看安裝后的包 創建wagtail項目安裝依賴遷移創建超級用戶運行項目 安裝虛擬環境 https://blog.csdn.net/gsl371/article/details/117917857 安裝wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

淘寶88vip退費問題

前一段時間&#xff0c;雙十一活動&#xff0c;想著開個淘寶的88vip領卷買東西會實惠一點&#xff0c;另外&#xff0c;它自帶的權益也不錯&#xff0c;有餓了嗎、網易云、優酷或者芒果的。但是到了當天發現&#xff0c;一個vip的卷也用不了&#xff0c;頓感什么惱火&#xff0…

synchronized的輕量級鎖居然不會自旋?

《Java并發編程的藝術》中說到「如果失敗&#xff0c;表示其他線程競爭鎖&#xff0c;當前線程便嘗試使用自旋來獲取鎖」&#xff0c;并且下文所配的流程圖中明確表示自旋失敗后才會升級為重量級鎖&#xff0c;但《深入理解Java虛擬機》又說「如果出現兩條以上的線程爭用同一個…