初學c語言21(文件操作)

一.為什么使用文件

之前我們寫的程序的數據都是存儲到內存里面的,當程序結束時,內存回收,數據丟失,

再次運行程序時,就看不到上次程序的數據,如果要程序的數據一直保存得使用文件

二.文件

文件一般可以分為倆種:

1.程序文件

包括源程序文件(后綴為 .c)、目標文件(Windows環境下后綴為 .obj)、可執行程序(Windows環境下后綴為 .exe

2.數據文件

文件的內容不一定是程序文件,而是程序運行時讀寫的文件,比如程序運行時需要從中讀取數據的文件或輸出的文件,舉例如下:

三.數據在文件中是怎么存儲的?

數據在內存是以二進制形式存儲,而在文件中:

字符一律按ASCLL碼值形式存儲

數值型數據既可以以ASCLL碼值形式存儲,也可以以二進制形式存儲

舉例:

如10000,以ASCLL碼值形式存儲到磁盤,在磁盤上占5個字節(一個字符一個字節),以二進制形式存儲,占4個字節,圖像如下:

四.二進制文件和文本文件

數據在內存是以二進制形式存儲,如果不加以轉化就輸出到外存的文件,就是二進制文件

以ASCLL碼值形式存儲的文件為文本文件

五.流和標準流

1.流

程序的數據要輸出到各種設備,也需要從外部設備獲取數據,由于設備的不同導致輸入輸出操作不同,為了方便就有了流的概念,c程序對文件、鍵盤等進行輸入輸出操作都是通過流操作的

一般情況下,向流中輸入輸出數據都是先打開流,在進行操作

2.標準流

之前的scanf函數從鍵盤輸入信息、primtf函數向屏幕輸出信息等卻沒看見打開流,是因為c程序在啟動的時候默認打開了三個流:

stdin ---標準輸入流,大多數環境下從鍵盤上輸入,scanf就是從標準輸入流中讀取數據的

stdout ---標準輸出流,大多數環境下從屏幕上輸出,printf就是將信息輸出到標準輸出流中

stderr ---標準錯誤流,大多數環境下從屏幕上輸出

六.文件指針

每打開一個文件,系統就會根據文件情況自動創建FILE結構體變量,并填充其中的信息,一般都是通過一個FILE的指針來維護其結構變量,即文件指針,該指針可以找到與它關聯的文件

七.文件的打開和關閉

文件在讀寫前應該打開文件,使用結束后關閉文件,不然會造成內存泄漏,數據丟失等

ANSIC規定使用fopen打開文件,fclose關閉文件

1.fopen

形式:

功能:

打開fileaname指定的文件,同時將文件和一個流進行關聯,后續對流的操作是通過函數返回的指針進行維護的(如fputc、fputs等),具體對流(關聯的文件)的操作是通過參數mode來指定的

參數:

filename:表示打開文件的名字,可以是相對路徑,也可以是絕對路徑

mode:表示打開文件的操作方式

返回值:

打開文件成功返回一個指向FILE結構體的指針,通過操作流(統一接口)指向文件信息區,關聯到此文件

失敗時返回NULL,所以每次打開文件都要檢查是否打開成功

文件打開方式(mode參數)

模式描述文件存在文件不存在
“? r? ”只讀正常打開文件返回NULLL
“ w ”只寫(覆蓋)清空文件類容創建新文件
" a "追加寫入(從末尾)從末尾寫入創建新文件
" r+ "讀寫(從開頭)正常打開文件返回NULL
" w+ "讀寫(覆蓋)清空文件類容創建新文件
" a+ "讀寫(追加)從末尾寫入創建新文件
"rb""wb"等二進制模式(加b)同上同上

2.fclose

形式:

功能:

關閉參數steam關聯的文件,并取消其關聯關系。與該流關聯的內部緩沖區解除關聯并刷新(將為寫入磁盤的輸入緩沖區的類容寫入,將未讀取的輸出緩沖區的類容丟棄)所以文件指針會變為野指針,得及時置為NULL

參數:

steam:指向要關閉文件流的FILE結構體的指針

返回值:

關閉成功返回0,否則返回EOF

應用舉例:

.? ----表示當前路徑

..? ----表示上一級路徑

/ ----表示分割目錄層級

相對文件舉例:data.txt(表示當前路徑的data.txt)或(./../data.txt)

絕對路徑舉例:C:\Users\xxx\Desktop

八.文件的順序讀寫

函數名功能適用于
fgetc從輸入流讀取一個字符所有輸入流
fputc向輸出流寫入一個字符所有輸出流
fgets從輸入流讀取一個字符串所有輸入流
fputs向輸出流寫入一個字符串所有輸出流
fscanf從輸入流讀取帶有格式的數據所有輸入流
fprintf向輸出流寫入帶有格式的數據所有輸出流
fread從輸入流讀取一塊數據文件輸入流
fwrite向輸出流寫入一塊數據文件輸出流

1.fputc

形式:

功能:

將參數character指定的字符寫入到stream指定的輸出流里,字符會被寫入內部指示器當前指向的位置(如有字符將被覆蓋),寫入后指示器向前移動一個位置

參數:

character:被寫入的字符

steam:指針,指向了輸出流

返回值:

寫入成功返回寫入的字符(int形式的)

失敗時返回EOF(通常為-1)

應用:

2.fgetc

形式:

功能:

從參數stream指定的輸入流讀取字符,讀取當前指示器指向的字符后,指示器也會向前移動一個位置

參數:指針,指向了輸入流

返回值:

讀取成功時返回讀取的字符(int類型的)

讀取失敗或讀取到文件末尾時返回EOF

應用:

2.feof和ferror

feof

形式:

功能:

檢測stream指針指向的流是否遇到了文件末尾。如果在讀取文件到末尾的時候,讀取就會停止,這時讀取函數就會在對應的流上設置一個文件結束的指示符,這個指示符會被 feof() 檢測到,如果檢測到指示符就返回非0的值,否則返回0

ferror

形式:

功能:

檢測stream指針指向的流是否讀/寫錯誤。如果讀/寫錯誤,文件讀寫就會停止,讀寫函數就會在對應的流上設置一個錯誤指示符,這個指示符會被ferror檢測到,被檢測到指示符被設置就會返回非0的值,否則返回0.

應用:

3.fputs

形式:

功能:

將str指向的字符串寫入到stream指向的輸出流里(不包括文件的控制符\0

參數:

str:指針,指向要寫入的字符串(必須以\0結尾)

stream:指針,指向輸出流

返回值:

成功時返回非負數

失敗時返回EOF

應用:

4.fgets

形式:

功能:

從stream指定的輸入流讀取字符串,直至讀到換行符、文件末尾、指定字符數(包括結尾\0),然后將讀取的字符串存儲到str指向的空間里

參數:

str:指向字符數組的指針,用來存儲讀取的字符

num:最大讀取字符數(實際最多讀取num-1個,每次讀取都會在結尾加\0

stream:指針,指向輸入流

返回值:

成功時返回str

讀取到文件末尾或讀取錯誤時返回NULL

應用:

5.fprinrf

形式:

功能:

將格式化數據輸出到stream指定的流里

參數:

stream:指針,指向要寫入的文件流里

format:格式化字符串(%d、%f等)

....? :提供與格式化字符串中說明符

返回值:

成功時返回寫入字符個數

失敗時返回負值

應用:

6.fscanf

形式:

功能:

從stream指定的文件流中讀取格式化數據的函數

參數:

stream:指針,指向輸入流

.... :可變參數列表,提供存儲數據的地址

其他和scanf一樣

返回值:

成功時返回成功填充到可變參數列表的項數,但可能少于預期,有如下原因:

格式化字符與數據不匹配

讀取發生錯誤

在讀取成功前讀到文件末尾或讀取錯誤返回EOF

應用:

7.fwrite

形式:

功能:

將ptr指向的數據塊(可控制)寫入到stream指向的輸出流里(以二進制寫入,所以得在使用前已二進制可寫方式打開

參數:

ptr:指針,指向要寫入的數據塊

size:要寫入每個數據塊的大小(單位字節)

num:要寫入數據項的數量

stream:指針,指向了要寫入的文件輸出流

返回值:

返回寫入的項數

應用:

8.fread

形式:

功能:

從stream指定的文件輸入流中讀取數據塊(讀取二進制形式文件

參數:

ptr:指針,指向存儲讀取的數據的空間

size:要讀取每個數據塊的大小

count:讀取數據塊的總量

stream:指針,指向要讀取數據的文件流

返回值:

讀取的項數

應用:

9.sprintf

形式:

功能:

將格式化數據轉化為一個字符串

參數:

str:指針,指向存儲生成的字符串

返回值:

成功時返回存儲的字符數(不包括\0)

失敗時返回負值

應用:

10.sscanf

形式:

功能:

從字符串讀取格式化數據

參數:

s:指針,指向要讀取的字符串

返回值:

成功時返回解析成功并賦值的項數

失敗時返回EOF

應用:

九.文件的隨機讀取

1.fseek

形式:

功能:

調整文件指示器的位置,可以從想讀/寫的位置讀/寫

參數:

stream:指針,指向一個流(如文件流)

origin:文件指示器的初始位置,可設置,有以下可能取值:

offset:相對于origin的偏移量

應用:

2.ftell

形式:

功能:

返回文件指示器相對于起始位置的偏移量

應用:

3.rewind

形式:

功能:

是文件指針回到起始位置

十.文件緩沖區

系統會自動在內存中為程序中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據先會送到文件緩沖區,裝滿后才一起送到磁盤上.

所以在讀寫模式下,寫完后再讀,可能數據還沒輸出到文件,導致讀不到數據,以下有個函數可以刷新文件緩沖區,能及時讀到數據,

fflush

形式:

功能:

強制刷新stream指定流的緩沖區,但對輸入流未定義

參數為NULL時刷新所有打開的輸出流

返回值:

成功時返回0,失敗時返回EOF

證明代碼:

#include <stdio.h>
#include <windows.h>
//VS2022 WIN11環境測試
int main()
{FILE* pf = fopen("dtat.txt", "w");fputs("abcdef", pf);//先將代碼放在輸出緩沖區printf("睡眠10秒-已經寫數據了,打開dtat.txt文件,發現文件沒有內容\n");Sleep(10000);printf("刷新緩沖區\n");fflush(pf);//刷新緩沖區時,才將輸出緩沖區的數據寫到?件(磁盤)//注:fflush 在?版本的VS上不能使?了printf("再睡眠10秒-此時,再次打開dtat.txt文件,文件有內容了\n");Sleep(10000);fclose(pf);//注:fclose在關閉?件的時候,也會刷新緩沖區pf = NULL;return 0;
}

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

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

相關文章

歷年廈門大學計算機保研上機真題

2025廈門大學計算機保研上機真題 2024廈門大學計算機保研上機真題 2023廈門大學計算機保研上機真題 在線測評鏈接&#xff1a;https://pgcode.cn/school 數字變換過程的最大值與步數 題目描述 輸入一個數字 n n n&#xff0c;如果 n n n 是偶數就將該偶數除以 2 2 2&…

MySql--定義表存儲引擎、字符集和排序規則

示例&#xff1a; CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,email VARCHAR(100) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ci;注意事項&#xff1a; 字符集和排序規則可以按列覆蓋表…

深耕數字化賽道,聯眾優車以創新風控體系構筑汽車金融護城河

近年來&#xff0c;在汽車金融市場規模持續擴大的行業背景下&#xff0c;企業風險管理能力已成為決定市場競爭格局的關鍵要素。面對快速擴張的市場需求&#xff0c;銀保監會2024年發布的《汽車金融公司監管評級辦法》明確要求行業強化風控能力建設&#xff0c;央行《金融科技發…

第十九章 正則表達式

第十九章 正則表達式 文本型數據在所有的類UNIX系統(如 Linux)中會扮演著重要角色&#xff0c;在完全領會這些工具的全部特征之前&#xff0c;要先了解一下工具最為復雜的用法和相關技術&#xff1a;正則表達式。 什么是正則表達式 簡單地說&#xff0c;正則表達式是一種用于…

內存監控方法與要點詳解

引言 在軟件性能測試領域&#xff0c;內存管理是評估系統穩定性和性能的關鍵指標之一。作為軟件測試工程師&#xff0c;我們經常遇到因內存泄漏、內存溢出等問題導致的系統崩潰或性能下降。本文將深入探討性能測試中內存監控的方法和要點&#xff0c;幫助測試團隊更有效地識別…

56、Ocelot 概述

Ocelot 是一個基于 .NET Core 開發的開源 API 網關&#xff0c;主要用于微服務架構中&#xff0c;為多個后端服務提供統一的訪問入口。它通過集中化管理請求路由、認證、限流、負載均衡等功能&#xff0c;簡化了客戶端與后端服務之間的交互&#xff0c;同時增強了系統的安全性和…

如何將多張圖組合到一張圖里同時保留高的分辨率(用PPT+AdobeAcrobat)

文章目錄 一、用PPT排版得到一頁排布了很多圖片的PPT二、用AdobeAcrobat打開pdf文件三、最后得到的圖片 一、用PPT排版得到一頁排布了很多圖片的PPT 步驟如下 ①將幻燈片大小的長設置為17.2&#xff0c;寬根據圖像多少進行調整&#xff0c;我這里是10 幻燈片大小的長設置步驟&…

【Web應用】若依框架:基礎篇12 項目結構

文章目錄 ?前言?一、課程講解&#x1f31f;1、尋找合適的對象?1) ?二、怎樣選擇設計模式&#xff1f;&#x1f31f;1、尋找合適的對象?1) ?三、怎樣使用設計模式&#xff1f;&#x1f31f;1、尋找合適的對象?1) ?總結 標題詳情作者JosieBook頭銜CSDN博客專家資格、阿里…

SolidWorks 文件打開時電腦卡頓問題分析與解決

最近遇到一個問題就是我點擊solid work的文件的時候會將電腦卡住然后電腦開始飛速的加載內存&#xff0c;鼠標移動很卡頓 解決辦法&#xff1a; 1.找到資源管理器 當遇到這種情況時&#xff0c;可以嘗試通過資源管理器來解決問題。首先&#xff0c;找到任務管理器&#xff08…

更新密碼--二階注入攻擊的原理

1.原理知識&#xff1a; 二階SQL注入攻擊&#xff08;Second-Order SQL Injection&#xff09;原理詳解 一、基本概念 二階注入是一種"存儲型"SQL注入&#xff0c;攻擊流程分為兩個階段&#xff1a; ??首次輸入??&#xff1a;攻擊者將惡意SQL片段存入數據庫?…

在 WSL Ubuntu-24.04 上安裝 Nacos 2.5.1 并使用 MySQL 數據庫

在微服務架構中&#xff0c;Nacos 是一個非常重要的服務發現和配置管理工具。本文將詳細介紹如何在 WSL&#xff08;Windows Subsystem for Linux&#xff09;中的 Ubuntu-24.04 系統上安裝 Nacos 2.5.1&#xff0c;并將其配置為使用 MySQL 數據庫進行數據存儲。我們將使用 roo…

2.qml使用c++

目錄 1.概述2.注冊方式3. 分類①枚舉類②工具類③數據類④資源類②視圖類 1.概述 qml是用來干嘛的&#xff1f; 當然是提高UI開發效率的 為什么要混合C&#xff1f; 因為qml無法處理密集型數據邏輯 而加入c則兼顧了性能 達到11>2 總結就是 qml 開發UI, C 實現邏輯 而js的用…

位置規劃模式和周期同步位置模式區別

專業方向&#xff1a; 伺服電機位置控制模式&#xff08;電氣自動化&#xff09; 標題解釋 位置規劃模式&#xff08;Profile Position Mode&#xff0c;PP&#xff09;和周期同步位置模式&#xff08;Cyclic Synchronous Position Mode&#xff0c;CSP&#xff09;區別。 常規…

C# ToString格式說明符

貨幣 "C"或"c" //C Console.WriteLine(666.ToString("C"));//&#xffe5;666.00//C數字 表示保留幾位小數精度 Console.WriteLine(666.ToString("C1"));//&#xffe5;666.0 Console.WriteLine(666.ToString("C3"));//&…

基本數據指針的解讀-C++

1、引言 筆者認為對于學習指針要弄清楚如下問題基本可以應付大部分的場景&#xff1a; ① 指針是什么&#xff1f; ② 指針的類型是什么&#xff1f; ③ 指針指向的類型是什么&#xff1f; ④ 指針指向了哪里&#xff1f; 2、如何使用指針 使用時的步驟如下&#xff1a; ① …

【Elasticsearch】suggest_mode

suggest_mode 是 Elasticsearch 中 term suggester 和 phrase suggester 的一個參數&#xff0c;用于控制建議的生成方式。它有以下三種模式&#xff1a; 1. missing&#xff1a;默認值。僅對索引中不存在的詞項提供建議。如果輸入的詞已經在索引中存在&#xff0c;則不會生成建…

九、【前后端聯調篇】Vue3 + Axios 異步通信實戰

九、【前后端聯調篇】Vue3 Axios 異步通信實戰 前言準備工作第一步&#xff1a;安裝 Axios第二步&#xff1a;封裝 Axios 實例第三步&#xff1a;創建 API 服務模塊第四步&#xff1a;在組件中調用 API第五步&#xff1a;測試前后端聯調 總結 前言 在 Web 開發中&#xff0c;…

【計算機網絡】傳輸層TCP協議——協議段格式、三次握手四次揮手、超時重傳、滑動窗口、流量控制、

&#x1f525;個人主頁&#x1f525;&#xff1a;孤寂大仙V &#x1f308;收錄專欄&#x1f308;&#xff1a;計算機網絡 &#x1f339;往期回顧&#x1f339;&#xff1a; 【計算機網絡】傳輸層UDP協議 &#x1f516;流水不爭&#xff0c;爭的是滔滔不息 一、TCP協議 UDP&…

php:5.6-apache Docker鏡像中安裝 gd mysqli 庫 【親測可用】

Dockerfile 代碼如下&#xff1a; FROM php:5.6-apache# 使用Debian歸檔源 RUN echo "deb http://archive.debian.org/debian stretch main contrib non-free" > /etc/apt/sources.list && \echo "deb http://archive.debian.org/debian-security s…

動態設置微信小程序頁面標題(navigationBarTitleText屬性)

前言&#xff1a; 最近在公司進行小程序研發的時候&#xff0c;產品給出了一個動態加載頁面標題的需求&#xff0c;經過調研之后將結果在這里與各位伙伴進行分享。 代碼展示&#xff1a; 在.json文件中進行初始配置&#xff1a; { "usingComponents": {}, &q…