C語言----文件操作(一)

一:C語言中文件的概念

? ? ? ? 對于文件想必大家都很熟悉,無論在windows上還是Linux中,我們用文件去存儲資料,記錄筆記,常見的如txt文件,word文檔,log文件等。那么,在C語言中文件是什么樣的存在呢,我們又怎么去操作文件,操作文件中又需要注意什么。

????????在操作系統中,為了統一對各種硬件的操作,簡化接口,不同的硬件設備也都被看成一個文件。對這些文件的操作,等同于對磁盤上普通文件的操作。例如:

  • 通常把顯示器稱為標準輸出文件,printf 就是向這個文件輸出數據;
  • 通常把鍵盤稱為標準輸入文件,scanf 就是從這個文件讀取數據。

?

? ? ? ? 在C語言中對文件的操作也是有規定的。如果不按規定來文件操作很容易出Bug,而且還不好查。

操作文件的正確流程為:

打開文件 --> 讀寫文件 --> 關閉文件

????????文件在進行讀寫操作之前要先打開,使用完畢要關閉。?

????????所謂打開文件,就是獲取文件的有關信息,例如文件名、文件狀態、當前讀寫位置等,這些信息會被保存到一個 FILE 類型的結構體變量中。關閉文件就是斷開與文件之間的聯系,釋放結構體變量,同時禁止再對該文件進行操作。??

????????在C語言中,文件有多種讀寫方式,可以一個字符一個字符地讀取,也可以讀取一整行,還可以讀取若干個字節。文件的讀寫位置也非常靈活,可以從文件開頭讀取,也可以從中間位置讀取。

二:文件打開和關閉

????????在C語言中,操作文件之前必須先打開文件;所謂“打開文件”,就是讓程序和文件建立連接的過程。打開文件之后,程序可以得到文件的相關信息,例如大小、類型、權限、創建者、更新時間等。在后續讀寫文件的過程中,程序還可以記錄當前讀寫到了哪個位置,下次可以在此基礎上繼續操作。

1,文件打開

使用 <stdio.h> 頭文件中的 fopen() 函數即可打開文件,它的用法為:

FILE *fopen(char *filename, char *mode);

入參:filename為文件名(包括文件路徑),mode為打開方式,它們都是字符串。

返回值:一個 FILE 類型的指針,我們可以通過判斷 fopen() 的返回值是否和 NULL 相等來判斷是否打開失敗:如果 fopen() 的返回值為 NULL,那么 fp 的值也為? NULL,此時 if 的判斷條件成立,表示文件打開失敗

????????fopen() 會獲取文件信息,包括文件名、文件狀態、當前讀寫位置等,并將這些信息保存到一個 FILE 類型的結構體變量中,然后將該變量的地址返回。FILE 結構體定義在?<stdio.h> 頭文件中

? ? ? ? 在上面我們提到fopen的第二個入參是mode,表示文件的打開方式,下面我們列出所有的mode組合。

????????在調用 fopen() 函數時,這些信息都必須提供,稱為“文件打開方式”。最基本的文件打開方式有以下幾種:

控制讀寫權限的字符串(必須指明)
打開方式說明
"r"以“只讀”方式打開文件。只允許讀取,不允許寫入。文件必須存在,否則打開失敗。
"w"以“寫入”方式打開文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么清空文件內容(相當于刪除原文件,再創建一個新文件)。
"a"以“追加”方式打開文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么將寫入的數據追加到文件的末尾(文件原有的內容保留)。
"r+"以“讀寫”方式打開文件。既可以讀取也可以寫入,也就是隨意更新文件。文件必須存在,否則打開失敗。
"w+"以“寫入/更新”方式打開文件,相當于wr+疊加的效果。既可以讀取也可以寫入,也就是隨意更新文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么清空文件內容(相當于刪除原文件,再創建一個新文件)。
"a+"以“追加/更新”方式打開文件,相當于a和r+疊加的效果。既可以讀取也可以寫入,也就是隨意更新文件。如果文件不存在,那么創建一個新文件;如果文件存在,那么將寫入的數據追加到文件的末尾(文件原有的內容保留)。
控制讀寫方式的字符串(可以不寫)
打開方式說明
"t"文本文件。如果不寫,默認為"t"
"b"二進制文件。

????????調用 fopen() 函數時必須指明讀寫權限,但是可以不指明讀寫方式(此時默認為"t")。?

讀寫權限和讀寫方式可以組合使用,但是必須將讀寫方式放在讀寫權限的中間或者尾部(換句話說,不能將讀寫方式放在讀寫權限的開頭)。例如:

  • 將讀寫方式放在讀寫權限的末尾:"rb"、"wt"、"ab"、"r+b"、"w+t"、"a+t"
  • 將讀寫方式放在讀寫權限的中間:"rb+"、"wt+"、"ab+"

整體來說,文件打開方式由 r、w、a、t、b、+ 六個字符拼成,各字符的含義是:

  • r(read):讀
  • w(write):寫
  • a(append):追加
  • t(text):文本文件
  • b(binary):二進制文件
  • +:讀和寫

?2,文件關閉

文件一旦使用完畢,應該用 fclose() 函數把文件關閉,以釋放相關資源,避免數據丟失。fclose() 的用法為:

int fclose(FILE *fp);

fp 為文件指針。文件正常關閉時,fclose() 的返回值為0,如果返回非零值則表示有錯誤發生。

下面我們通過具體的代碼來展示如何正確的打開和關閉文件(Linux上操作)

#include <stdio.h>int main()
{FILE *fp = fopen("input.txt","r");if(fp == NULL){printf("open file input.txt fail!\n");return 0;}printf("open file input.txt success!\n");fclose(fp);return 0;
}

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

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

相關文章

threadpool github線程池學習

參考項目 https://github.com/progschj/ThreadPool 源碼分析 // 常規頭文件保護宏, 避免重復 include #ifndef THREAD_POOL_H #define THREAD_POOL_H// 線程池, 存儲線程對象; #include <vector>// 任務隊列, 雙向都可操作隊列, queue 不能刪除首個元素 #include <…

微信小程序制作-背單詞的小程序制作

微信小程序–背單詞的 好久沒有發過文章了&#xff0c;但是不代表著我不去學習了嘍&#xff0c;以下是我最近做的東西&#xff0c;前端的UI由朋友設計的&#xff0c;目前這個是前端使用的是微信小程序后端是Python的一個輕量型框架&#xff0c;FastApi&#xff0c;嗯&#xff…

MyBatis 四大核心組件之 Executor 源碼解析

&#x1f680; 作者主頁&#xff1a; 有來技術 &#x1f525; 開源項目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 倉庫主頁&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 歡迎點贊…

List 接口

1 List 接口 java.util 中的集合類包含 Java 中某些最常用的類。最常用的集合類是 List 和 Map。 List是一種常用的集合類型&#xff0c;它可以存儲任意類型的對象&#xff0c;也可以結合泛型來存儲具體的類型對象&#xff0c;本質上就是一個容器。 1.1 List 類型介紹 有序性…

06-React組件 Redux React-Redux

React組件化&#xff08;以Ant-Design為例&#xff09; 組件化編程&#xff0c;只需要去安裝好對應的組件&#xff0c;然后通過各式各樣的組件引入&#xff0c;實現快速開發 我們這里學習的是 Ant-design &#xff08;應該是這樣&#xff09;&#xff0c;它有很多的組件供我們…

計算機網絡測試題第二部分

前言:如果沒有做在線測試請自主獨立完成&#xff0c;本篇文章只作為學習計算機網絡的參考&#xff0c;題庫中的題存在一定錯誤和不完整&#xff0c;請學習時&#xff0c;查找多方書籍論證&#xff0c;獨立思考&#xff0c;如果存在疑慮可以評論區討論。查看時&#xff0c;請分清…

pytorch debug 常用工具

自動辨識圖像格式可視化 import numpy as np import matplotlib.pyplot as plt from PIL import Imagedef convert_to_numpy(image_input):"""自動檢測輸入圖像類型&#xff0c;并將其轉換為NumPy數組。"""if isinstance(image_input, np.ndarr…

7-3 Left-pad

根據新浪微博上的消息&#xff0c;有一位開發者不滿NPM&#xff08;Node Package Manager&#xff09;的做法&#xff0c;收回了自己的開源代碼&#xff0c;其中包括一個叫left-pad的模塊&#xff0c;就是這個模塊把javascript里面的React/Babel干癱瘓了。這是個什么樣的模塊&a…

物聯網IC

物聯網IC 電子元器件百科 文章目錄 物聯網IC前言一、物聯網IC是什么二、物聯網IC的類別三、物聯網IC的應用實例四、物聯網IC的作用原理總結前言 物聯網IC的功能和特性可以根據不同的物聯網應用需求來選擇和配置,以滿足物聯網設備在連接、通信、感知和控制方面的需求。 一、物…

猜數字游戲Ⅱ

你和朋友一起玩猜數字游戲&#xff0c;你寫出一個秘密數字&#xff0c;請朋友猜這個數字是多少。朋友每猜測一次&#xff0c;你就會給他一個包含下述信息的提示&#xff1a; 猜測數字中有多少位屬于數字和確切位置都猜對了&#xff08;稱為 "Bulls"&#xff0c;公牛&…

VOL-vue 框架 文件上傳控件關于大文件上傳等待的修改

我的項目在測試voltable列表組件中對阿里云OSS做附件上傳時&#xff0c;幾十M的文件可能就會需要一段時間來上傳&#xff0c;才能有OSS的狀態和鏈接返回。 但是控件VolUpload.vue并沒有去在這方面做任何交互體驗上的控制&#xff0c;而且VolUpload.vue本身寫的幾個上傳函數都是…

SpringBoo在項目停止(服務停止/關閉退出)之后執行的方法

SpringBoo在項目停止/服務停止/關閉退出之后執行的方法 1.實現DisposableBean接口2.使用PreDestroy注解 SpringApplication會向JVM注冊一個關閉鉤子(hook)&#xff0c;以確保ApplicationContext在退出時正常關閉。 可以使用所有標準的Spring生命周期回調&#xff08;例如Dispos…

內測分發是什么?十年的前端開發者帶你了解

內測分發是軟件開發過程中的一個階段&#xff0c;特別指軟件還未完全完成或準備對外廣泛發布前&#xff0c;向一定范圍的用戶群體提供該軟件版本的測試機會&#xff0c;以便收集反饋和修復潛在的問題。在講解內測分發之前&#xff0c;我們需要明確幾個相關概念&#xff1a; 軟件…

區塊鏈媒體宣發:揭示優勢與趨勢,引領信息傳播新時代

在數字化潮流中&#xff0c;區塊鏈技術正以驚人的速度改變著傳媒行業的格局。從區塊鏈媒體宣發中獲得的種種優勢和未來的趨勢&#xff0c;不僅為企業帶來了新的推廣途徑&#xff0c;也在信息傳播領域掀起了一場革命。本文將深入探討區塊鏈媒體宣發的優勢以及未來的發展趨勢。 1…

排序算法---選擇排序

1.實現流程&#xff1a; 1. 把第一個沒有排序過的元素設置為最小值&#xff1b; 2. 遍歷每個沒有排序過的元素&#xff1b; 3. 如果元素 < 現在的最小值&#xff1b; 4. 將此元素設置成為新的最小值&#xff1b; 5. 將最小值和第一個沒有排序過的位置交換 選擇排序執行流程…

初識Ceph --組件、存儲類型、存儲原理

目錄 ceph組件存儲類型塊存儲文件存儲對象存儲 存儲過程 ceph Ceph&#xff08;分布式存儲系統&#xff09;是一個開源的分布式存儲系統&#xff0c;設計用于提供高性能、高可靠性和可擴展性的存儲服務&#xff0c;可以避免單點故障&#xff0c;支持塊存儲、對象存儲以及文件系…

【小白專用】Apache2.4+PHP8.3+MYSQL的配置

1.下載PHP和Apache 1、PHP下載 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.使用Apache作為服務器的話&#xff0c;一定要下載Thread Safe的&#xff0c;否則沒有php8apache2_4.dll這個文件&#xff0c; 如果使用IIS的請下載 NON Tread safe的 2.如果…

USB連接器

USB連接器 電子元器件百科 文章目錄 USB連接器前言一、USB連接器是什么二、USB連接器的類別三、USB連接器的應用實例四、USB連接器的作用原理總結前言 USB連接器的使用廣泛,幾乎所有現代電子設備都具備USB接口,使得設備之間的數據傳輸和充電變得簡單和便捷。 一、USB連接器是…

element-ui按鈕el-button,點擊之后恢復之前的顏色

在開發過程中, 使用el-button 按鈕點擊之后, 沒有恢復到之前的顏色, 還是保持點擊之后的顏色,需要解決這個問題, <template><div><el-button size"mini" type"primary" plain click"onClick($event)">按鈕</el-button>…

iOS按鈕控件UIButton使用

1.在故事板中添加按鈕控件,步聚如下: 同時按鈕Shift+Commad+L在出現在控件庫中選擇Button并拖入View Controller Scene中 將控件與變量btnSelect關聯 關聯后空心變實心 如何關聯?直接到屬性窗口拖按鈕變量到控件上,出現一條線,然后松開,這樣就關聯成功了 關聯成功后屬性窗口…