文件操作(超詳細版本)

本章重點

  1. 為什么使用文件
  2. 什么是文件
  3. 文件的打開和關閉
  4. 文件的順序讀寫
  5. 文件的隨機讀寫
  6. 文件讀取結束的判定

為什么使用文件

我們前面學習結構體時,寫通訊錄的程序,當通訊錄運行起來的時候,可以給通訊錄中增加、刪除數 據,此時數據是存放在內存中,當程序退出的時候,通訊錄中的數據自然就不存在了,等下次運行通訊 錄程序的時候,數據又得重新錄入,如果使用這樣的通訊錄就很難受。 我們在想既然是通訊錄就應該把信息記錄下來,只有我們自己選擇刪除數據的時候,數據才不復存在。 這就涉及到了數據持久化的問題,我們一般數據持久化的方法有,把數據存放在磁盤文件、存放到數據 庫等方式。 使用文件我們可以將數據直接存放在電腦的硬盤上,做到了數據的持久化。

什么是文件

在程序設計中我們談的文件可以分為兩類:程序文件和數據文件(從文件功能的角度上來講)。

程序文件

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

數據文件

文件的內容不一定是程序,屙屎程序運行時讀寫的數據,比如程序運行需要從中讀取數據的文件,或者輸出內容的文件

本章主要討論數據文件

文件名

一個文件要有唯一的文件標識,以便用戶識別和引用。

文件名包括3各部分:文件路徑+文件名主干+文件后綴

例如:c:code\test.txt

文件標識常被稱為文件名

文件類型

根據數據的組織形式,數據文件被稱為文本文件或者二進制文件

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

如果要求在外存上以ASCII碼的形式存儲,則需要在存儲前轉換,以ASCII碼字符的形式存儲的文件就是文本文件

文件緩沖區

ANSIC 標準采用“緩沖文件系統”處理的數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程序 中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖區,裝 滿緩沖區后才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸入到內存緩 沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。緩沖區的大小根 據C編譯系統決定的

文件指針

緩沖文件系統中,關鍵的概念是“文件類型指針”,簡稱“文件指針”。 每個被使用的文件都在內存中開辟了一個相應的文件信息區,用來存放文件的相關信息(如文件的名 字,文件狀態及文件當前的位置等)。這些信息是保存在一個結構體變量中的。該結構體類型是由系統 聲明的,取名FILE.

不同的C編譯器的FILE類型包含的內容不完全相同,但是大同小異。 每當打開一個文件的時候,系統會根據文件的情況自動創建一個FILE結構的變量,并填充其中的信息, 使用者不必關心細節。 一般都是通過一個FILE的指針來維護這個FILE結構的變量,這樣使用起來更加方便。 下面我們可以創建一個FILE*的指針變量:

FILE* pf;

定義pf是一個指向FILE類型數據的指針變量。可以使pf指向某個文件的文件信息區(是一個結構體變 量)。通過該文件信息區中的信息就能夠訪問該文件。也就是說,通過文件指針變量能夠找到與它關聯 的文件。

文件的打開和關閉

文件在讀寫之前應該先打開文件,在使用結束之后應該關閉文件。 在編寫程序的時候,在打開文件的同時,都會返回一個FILE*的指針變量指向該文件,也相當于建立了指 針和文件的關系。

ANSIC 規定使用fopen函數來打開文件,fclose來關閉文件。

/* fopen fclose example */#include <stdio.h>int main ()
{FILE * pFile;//打開文件pFile = fopen ("myfile.txt","w");//文件操作if (pFile!=NULL){fputs ("fopen example",pFile);//關閉文件fclose (pFile);}return 0;
}

文件的順序讀寫

功能 函數名 適用于

字符輸入函數 fgetc 所有輸入流

字符輸出函數 fputc 所有輸出流

文本行輸入函數 fgets 所有輸入流

文本行輸出函數 fputs 所有輸出流

格式化輸入函數 fscanf 所有輸入流

格式化輸出函數 fprintf 所有輸出流

二進制輸入 fread 文件 二進制輸出

對比一組函數(面試題)

scanf/fscanf/sscanf

printf/fprintf/sprintf

  • scanf/printf是針對標準輸入流、標準輸出流的格式化輸入、輸出語句
  • fscanf/fprintf是針對所有輸入流/所有輸出流的格式化輸入/輸出語句
  • sscanf是從字符串中讀取格式化的數據
  • sprintf是把格式化的數據輸出成字符串

文件的隨機讀寫

fseek--定位文件指針

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

根據文件指針的位置和偏移量來定位文件指針

ftell--返回文件指針相對于起始位置的偏移量

long int ftell(FILE* stream);

rewind--將文件指針的位置返回到起始位置

void rewind(FILE* stream);

文件結束判定

被錯誤使用的feof函數

?牢記:在文件讀取過程中,不能用feof函數的返回值直接來判斷文件的是否結束。

feof 的作用是:當文件讀取結束的時候,判斷是讀取結束的原因是否是:遇到文件尾結束。

1. 文本文件讀取是否結束,判斷返回值是否為 EOF ( fgetc ),或者 NULL ( fgets ) 例如:

  • fgetc 判斷是否為 EOF .
  • fgets 判斷返回值是否為 NULL .

2. 二進制文件的讀取結束判斷,判斷返回值是否小于實際要讀的個數。 例如:

  • fread判斷返回值是否小于實際要讀的個數。?
#include<stdio.h>
int main()
{FILE* pf = fopen("test.txt", "r");if (pf == NULL){perror("open file test.txt");return 0;}//讀文件int ch = 0;while ((ch = fgetc(pf)) != EOF){putchar(ch);}if (ferror(pf)){printf("error\n");}else if (feof(pf)){printf("end of file\n");}fclose(pf);pf = NULL;return 0;
}

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

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

相關文章

手勢識別應用介紹

目錄 一、功能介紹 二、安裝部署說明 2.1 文件目錄說明 2.2 手勢識別部分 一、功能介紹 這是一個通過攝像頭捕獲手勢&#xff0c;根據不同的手勢來做出不同操作的計算機程序。目前可以識別9種手勢&#xff0c;可以根據識別到的手勢&#xff0c;進行打開應用、增大音量、減小音量…

[AIGC] 請舉例說明在運行時讀取注解的應用場景。

很高興你對于在運行時讀取注解的應用場景感興趣。以下是我為你整理的一些典型場景&#xff1a; 1. Spring框架 Spring框架廣泛地使用了運行時注解。例如Autowired注解&#xff0c;它可以在運行時實現依賴注入的功能。Spring在啟動時&#xff0c;會通過反射機制尋找到被Autowi…

mkfs.ext4 --- 對磁盤設備進行Ext4格式化

mkfs.ext4命令來自于英文詞組“make filesystem Ext4”的縮寫&#xff0c;其功能是用于對磁盤設備進行Ext4格式化的操作。 mkfs.ext4 參數-b block-size 塊大小&#xff08;1k,2k,4k&#xff09; -c 壞塊測試 -l filename從文件讀壞塊列表 -C cluster-size 簇大小 (大塊分配持性…

交友社交軟件開發-php交友聊天系統-

為了開發一個高效的交友系統&#xff0c;需要一個完善的信息管理和篩選機制。這個系統應該能夠根據用戶的個人信息、興趣愛好、價值觀等標準進行篩選&#xff0c;并向用戶提供符合他們要求心儀的人的信息。為了實現這個目標&#xff0c;系統可以利用人工智能技術&#xff0c;分…

MySQL基礎-----SQL語句之DDL語句

目錄 前言 開啟登錄數據庫 一、數據庫操作 1.查詢所有數據庫 2.切換使用數據庫 3.查詢當前使用的數據庫 4.創建數據庫 創建一個hello數據庫, 使用數據庫默認的字符集。 創建一個itheima數據庫&#xff0c;并且指定字符集 5.刪除數據庫 二、表操作 1.查詢當前數據庫所有…

JAVA的學習日記

JAVA的學習日記&#xff08;2024.3.1&#xff09;&#xff08;b站韓順平老師課程學習筆記版&#xff09; ps:撿起忘光光的Java語言 Sublime //1. public是公有&#xff0c;class是類 //2. public class Hello表示Hello是一個類&#xff0c;是一個public公有的類 //3. Hello{…

解決Unable to load class ‘org.gradle.api.attributes.VerificationType‘

在使用AdnroidStudio開發過程中難免會遇到Unable to load class org.gradle.api.attributes.VerificationType報錯&#xff0c;可以嘗試清理緩存重啟解決 打開 File-》Invalidate Caches... 重啟AndroidStudio后&#xff0c;重新加載即可&#xff0c;但也不是百分百解決。

【MySQL】:高效利用MySQL函數實用指南

&#x1f3a5; 嶼小夏 &#xff1a; 個人主頁 &#x1f525;個人專欄 &#xff1a; MySQL從入門到進階 &#x1f304; 莫道桑榆晚&#xff0c;為霞尚滿天&#xff01; 文章目錄 &#x1f4d1;前言一. MySQL函數概論二. 字符串函數三. 數值函數四. 日期函數五. 流程函數&#x1…

基于NSFW數據集的違規圖片檢測系統

目錄 一、功能介紹 二、安裝部署說明 2.1數據集簡介 2.2文件目錄說明 一、功能介紹 本程序是一個違規圖片檢測系統&#xff0c;能夠識別用戶上傳的信息圖片&#xff0c;是否包含有敏感&#xff08;NSFW&#xff0c;Not Safe For Work&#xff09;信息。 本程序使用雅虎開源的NS…

前后端分離開發

目錄 前言 一、前后端分離開發 1. 介紹 2. 開發流程 3. 前端技術棧 &#xff08;1&#xff09;開發工具: &#xff08;2&#xff09;技術框架: 二、Yapi 1. 介紹 2. 使用 &#xff08;1&#xff09;準備 &#xff08;2&#xff09;定義接口 &#xff08;3&#x…

芯科科技為全球首批原生支持Matter-over-Thread的智能鎖提供強大助力,推動Matter加速成為主流技術

智能鎖領域的先鋒企業U-tec和Nuki選擇芯科科技解決方案&#xff0c;成為Matter-over-Thread應用的領先者 致力于以安全、智能無線連接技術&#xff0c;建立更互聯世界的全球領導廠商Silicon Labs&#xff08;亦稱“芯科科技”&#xff0c;NASDAQ&#xff1a;SLAB&#xff09;今…

2024廣東水展即將開幕 | 聚焦凈水行業熱點搶占行業新機遇

2024廣東水展即將開幕 | 聚焦凈水行業熱點搶占行業新機遇 隨著消費升級和人們對環境健康的意識增強&#xff0c;人們除了關注凈水產品的性能外&#xff0c;對產品的設計、服務、多應用場景化等需求也愈發多樣化。節能環保、智能化成為產品迭代升級主要方向。據奧維云網數據顯示…

Docker中使用Tomcat并部署war工程

系列文章目錄 文章目錄 系列文章目錄前言一、構建鏡像二、運行鏡像三、列出正在運行的容器四、停止正在運行的容器 前言 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站&#xff0c;這篇文…

物聯網技術助力智慧城市安全建設:構建全方位、智能化的安全防護體系

一、引言 隨著城市化進程的加速和信息技術的迅猛發展&#xff0c;智慧城市已成為現代城市發展的重要方向。在智慧城市建設中&#xff0c;安全是不可或缺的一環。物聯網技術的快速發展為智慧城市安全建設提供了有力支持&#xff0c;通過構建全方位、智能化的安全防護體系&#…

Kali Linux 安裝 + 獲取 root 權限 + 遠程訪問

一、什么是Kali kali是linux其中一個發行版&#xff0c;基于Debian&#xff0c;前身是BackTrack&#xff08;簡稱BT系統&#xff09;。kali系統內置大量滲透測試軟件&#xff0c;可以說是巨大的滲透系統&#xff0c;涵蓋了多個領域&#xff0c;如無線網絡、數字取證、服務器、密…

Python讀取hbase數據庫

1. hbase連接 首先用hbase shell 命令來進入到hbase數據庫&#xff0c;然后用list命令來查看hbase下所有表&#xff0c;以其中表“DB_level0”為例&#xff0c;可以看到庫名“baotouyiqi”是拼接的&#xff0c;python代碼訪問時先連接&#xff1a; def hbase_connection(hbase…

red hat 6.9版本7.9版本 忘記root密碼重置方法

文章目錄 1、重置密碼具體步驟Oracle Linux 6.9版本&#xff1a;1、開機到此界面按e2、在以下界面選擇后按e3、選擇相應內核后按e4、在此界面輸入 single 回車5、回到內核界面后按b進入引導系統6、在#后輸入passwd root修改密碼7、修改密碼&#xff1a;8、Reboot重啟9、使用新密…

【工作實踐-06】uniapp使用webView

一、建立APP頁面和webview的通訊 1.引入webview.js App 端使用 uni.web-view.js 的最低版為 uni.webview.1.5.4.js APP端可以支持網絡網頁和本地網頁&#xff0c;但如果使用本地網頁和相關資源&#xff08;js、css等文件&#xff09;必須放在 static 目錄下。 2.引入搭橋docum…

PostgreSQL中int類型達到上限的一些處理方案

使用int類型作為表的主鍵在pg中是很常見的情況&#xff0c;但是pg中int類型的范圍在-2147483648到2147483647&#xff0c;最大只有21億&#xff0c;這個在一些大表中很容易就會達到上限。一旦達到上限&#xff0c;那么表中便沒辦法在插入數據了&#xff0c;這個將會是很嚴重的問…

【react native】css踩坑記錄

1、IOS上面opacity重疊失效 在 iOS 上&#xff0c;當兩個具有相同背景色的元素重疊時&#xff0c;不透明度&#xff08;opacity&#xff09;較低的元素會顯示在較高的元素上方。 所以考慮使用rgba的形式。 // 對于下面這種寫法&#xff0c;如果存在container和activeIndicat…