C語言 文件操作(2)

目錄

1.文件的順序讀寫

2.文件的隨機讀寫

3.文件讀取結束的判定

4.文件的緩沖區


1.文件的讀取順序

1.1 順序讀寫函數介紹

上面說的適用于所有輸入流一般指適用于標準輸入流和其他輸入流(如文件輸入流);所有輸出流

一般指適用于標準輸出流和其他輸出流(如文件輸出流)。

1.2 對比一組函數

  • scanf/fscanf/sscanf
  • printf/fprintf/sprintf

scanf/fscanf/sscanf:
?
- scanf
- 功能:從標準輸入流(通常是鍵盤)讀取數據 ,按照指定格式進行解析并存儲到對應變量中。例如?scanf("%d", &num);??,從鍵盤讀取一個整數存入?num?變量。
- 特點:直接從標準輸入獲取數據,使用方便,但要注意輸入格式與指定格式嚴格匹配,否則可能導致輸入錯誤或程序異常。


- fscanf
- 功能:從指定的文件輸入流中讀取數據,按格式解析存儲。如?fscanf(fp, "%d", &num);??,從文件指針?fp?指向的文件中讀取整數存到?num??。
- 特點:用于文件數據讀取,可靈活處理文件中不同格式數據,但要先正確打開和操作文件。


- sscanf
- 功能:從字符串中讀取數據,按格式解析存儲。比如?sscanf(str, "%d", &num);??,從字符串?str?中提取整數存到?num??。
- 特點:在處理已存在字符串中的數據時很有用,可方便地從字符串提取不同類型數據。
?
printf/fprintf/sprintf:
?
- printf
- 功能:向標準輸出流(通常是控制臺)按照指定格式輸出數據。像?printf("The number is %d", num);??,在控制臺顯示變量?num?的值。
- 特點:是最常用的輸出方式,能快速將數據展示在屏幕上。


- fprintf
- 功能:向指定文件輸出流寫入數據,按格式輸出。例如?fprintf(fp, "The number is %d", num);??,將數據寫入文件指針?fp?指向的文件。
- 特點:用于文件數據寫入,可將程序數據按格式保存到文件中。


- sprintf
- 功能:將格式化數據寫入字符串中。如?sprintf(str, "The number is %d", num);??,把數據按格式存入字符串?str??。
- 特點:常用于字符串格式化構建,方便生成特定格式字符串用于后續處理。

2.文件的隨機讀寫

2.1 fseek

根據文件指針的位置和偏移量來定位文件指針(文件內容的光標)。

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

例子:

/* fseek example */
#include <stdio.h>int main ()
{FILE * pFile;pFile = fopen ( "example.txt", "wb" );fputs ( "This is an apple.", pFile );fseek ( pFile, 9, SEEK_SET );fputs ( "sam", pFile );fclose ( pFile );return 0;
}

2.2 ftell

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

long int ftell ( FILE * stream );

例子:

/* ftell example : getting size of a file */
#include <stdio.h>int main ()
{FILE * pFile;long size;pFile = fopen ("myfile.txt","rb");if (pFile==NULL)perror ("Error opening file");else{fseek (pFile, 0, SEEK_END);  // non-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}

2.3 rewind

讓文件指針的位置回到文件的起始位置

void rewind ( FILE * stream );

例子:

/* rewind example */
#include <stdio.h>int main ()
{int n;FILE * pFile;char buffer [27];pFile = fopen ("myfile.txt","w+");for ( n='A' ; n<='Z' ; n++)fputc ( n, pFile);rewind (pFile);fread (buffer,1,26,pFile);fclose (pFile);buffer[26]='\0';printf(buffer);return 0;
}

3.文件讀取結束的判定

3.1 被錯使用的feof

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

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

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

例如:

- fgetc 判斷是否為 EOF .

- fgets 判斷返回值是否為 NULL .
?
2.?二進制文件的讀取結束判斷,判斷返回值是否小于實際要讀的個數。

例如:

?- fread判斷返回值是否小于實際要讀的個數。

?文本文件的例子:

#include <stdio.h>
#include <stdlib.h>int main(void)
{int c; // 注意: int,非char, 要求處理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 當讀取失敗的時候或者遇到文件結束的時候,都會返回EOFwhile ((c = fgetc(fp)) != EOF) // 標準C I/O讀取文件循環{putchar(c);}//判斷是什么原因結束的if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

二進制文件的例子:

#include <stdio.h>enum { SIZE = 5 };int main(void)
{double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必須用二進制模式fwrite(a, sizeof *a, SIZE, fp); // 寫double的數組fclose(fp);double b[SIZE];fp = fopen("test.bin", "rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 讀double的數組if(ret_code == SIZE) {puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n)printf("%f ", b[n]);putchar('\n');} else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

4.文件緩沖區

ANSI C標準采用“緩沖文件系統”處理數據文件的,所謂緩沖文件系統是指系統自動地在內存中為程

序中每一個正在使用的文件開辟一塊“文件緩沖區”。從內存向磁盤輸出數據會先送到內存中的緩沖

區,裝滿緩沖區后才一起送到磁盤上。如果從磁盤向計算機讀入數據,則從磁盤文件中讀取數據輸

入到內存緩沖區(充滿緩沖區),然后再從緩沖區逐個地將數據送到程序數據區(程序變量等)。

緩沖區的大小根據C編譯系統決定的。

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

這里可以得出一個結論:

因為有緩沖的存在,C語言在操作文件的時候,需要做刷新緩沖區或者在文件操作結束的時候關閉文

件,如果不做,可能導致讀寫文件的問題。

關于文件操作的所有內容到這就已經完了,下期我們講解編譯和鏈接部分相關的內容,感謝大家的

觀看!

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

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

相關文章

QGIS新手教程2:線圖層與多邊形圖層基礎操作指南(點線互轉、中心點提取與WKT導出)

QGIS新手教程&#xff1a;線圖層與多邊形圖層基礎操作指南&#xff08;點線互轉、中心點提取與WKT導出&#xff09; 目錄 QGIS新手教程&#xff1a;線圖層與多邊形圖層基礎操作指南&#xff08;點線互轉、中心點提取與WKT導出&#xff09;&#x1f4cc; 引言第一部分&#xff1…

Netty 框架介紹

1. Netty 框架介紹 Netty 是一個基于 Java NIO&#xff08;Non-blocking I/O&#xff09;的異步事件驅動網絡應用框架&#xff0c;旨在快速開發高性能、高可靠性的網絡服務器和客戶端。它簡化了 TCP/UDP 等協議的編程&#xff0c;并提供了高度可定制的組件&#xff0c;適用于高…

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器

Eclipse 插件開發 5.2 編輯器 獲取當前編輯器 1 獲取活躍編輯器2 獲取全部編輯器 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Click1 Bundle-SymbolicName: com.xu.click1;singleton:true Bundle-Version: 1.0.0 Bundle-Activator: com.xu.click1.Activato…

完成LRU頁面調度算法的模擬

目錄 1.上代碼 2.實現思路 1.上代碼 #include<iostream> using namespace std; //內存塊類 class memory { public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(me…

Three.js 直線拐角自動圓角化(圓弧轉彎)

目錄 前言 計算圓心坐標 計算兩條直線的角平分線 計算dir1 dir2的夾角 計算圓心到直線交點的距離 計算圓心 計算從正X軸算起曲線開始、終止的角度 計算垂足與兩直線交點距離 計算垂足 計算垂線 計算兩垂線與x軸的夾角 ?編輯 計算圓弧是否按照順時針方向來繪制 成功…

【MYSQL】mysql單表億級數據查詢優化處理

1、實踐表明mysql單表數據超過一億后&#xff0c;數據進行交并差效率會非常慢&#xff0c;所以這時候就要進行表的優化。 我這里主要是使用索引。 2、表字段精量精簡 查索引&#xff0c;建索引&#xff0c;刪索引語法 --查看索引 -- SHOW INDEX FROM 表名; -- 刪除索引 --AL…

C++基礎:模擬實現vector(有存在深層次的淺拷貝問題)

目錄 引言 一、vector的基本框架 二、尾插push_back、reserve擴容、任意位置插入insert&#xff08;增&#xff09; 1.reserve擴容 2.push_back尾插 3.深層次的淺拷貝問題 4. 任意位置插入數據insert(會使迭代器失效) 三、構造、析構、拷貝構造函數 1.構造函數 1.1無…

【力扣】關于鏈表索引

怎么才能走到目標節點呢&#xff1f; 從9走到2&#xff0c;需要2步&#xff0c;他們的索引分別是&#xff1a;0&#xff0c;2 在for循環里&#xff1a;int i 0; i < 2; i i的范圍是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果從虛擬頭節點開始走到2&#x…

C++ ODB框架詳解:現代C++對象關系映射解決方案

目錄 框架簡介安裝與配置基礎概念實體映射數據庫操作查詢操作高級功能性能優化最佳實踐 框架簡介 ODB&#xff08;Object-Relational Database&#xff09;是一個專為C設計的對象關系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司開發。它提供了一種…

Ai書簽管理工具開發全記錄(一):項目總覽與技術藍圖

文章目錄 Ai書簽管理工具開發全記錄&#xff08;一&#xff09;&#xff1a;項目總覽與技術藍圖 ?1. 項目背景與核心價值 &#x1f4a1;1.1. 核心特點 2. 技術架構分析 &#x1f3d7;?功能架構全景圖典型工作流 3. 核心技術棧選擇 &#x1f6e0;?4. 預期使用功能說明 &#…

GUI 編程——python

GUI 編程核心概念 GUI&#xff08;圖形用戶界面&#xff0c;Graphical User Interface&#xff09; 是一種通過圖形元素&#xff08;窗口、按鈕、菜單等&#xff09;與用戶交互的應用程序形式&#xff0c;相比命令行界面更直觀易用。以下是學習 GUI 編程的基礎概念和流程&…

【Doris基礎】Apache Doris 基本架構深度解析:從存儲到查詢的完整技術演進

目錄 1 引言 2 Doris 架構全景圖 2 核心組件技術解析 2.1 Frontend 層&#xff08;FE&#xff09; 2.2 Backend 層&#xff08;BE&#xff09; 3 數據存儲與復制機制 3.1 存儲架構演進 3.2 副本復制策略 4 查詢處理全流程解析 4.1 查詢生命周期 5 高可用設計 5.1 F…

光電賦能低空場景,靈途科技助力無人機持續升級

2025 UASE 主題為“步入低空經濟新時代”的“2025第九屆世界無人機大會暨國際低空經濟與無人系統博覽會/第十屆深圳國際無人機展覽會”5月23日在深圳會展中心隆重開幕。本屆展會匯聚了全球800余家企業參展&#xff0c;展示5000多款無人機及系統設備&#xff0c;全面呈現低空經…

iOS QQ抽屜式導航的實現

QQ個人中心的側滑功能(通常稱為"抽屜式導航")可以通過以下幾種方式在iOS中實現&#xff1a; 主要實現方案 使用第三方庫 最快速的方式是使用成熟的第三方庫&#xff1a; SWRevealViewController&#xff1a;最流行的側滑菜單庫MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行標簽或列標簽前添加指定前綴的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行標簽或列標簽后添加指定后綴的方法DataFram…

長短期記憶網絡 (LSTM) 詳解:從原理到應用

一、引言&#xff1a;序列數據處理的挑戰? 在自然語言處理、語音識別、時間序列分析等領域&#xff0c;數據通常以序列形式存在&#xff0c;前后數據點之間存在依賴關系。傳統循環神經網絡 (RNN) 雖然能捕捉序列依賴&#xff0c;但存在嚴重的梯度消失 / 爆炸問題&#xff0c;…

三天掌握PyTorch精髓:從感知機到ResNet的快速進階方法論

本文較長&#xff0c;建議點贊收藏&#xff0c;以免遺失。更多AI大模型應用開發學習視頻及資料&#xff0c;盡在聚客AI學院。 一、分析式AI基礎與深度學習核心概念 1.1 深度學習三要素 數學基礎&#xff1a; f(x;W,b)σ(Wxb)(單層感知機) 1.2 PyTorch核心組件 張量操作示例…

Linux操作系統概述

一、操作系統的作用 1、五大基本功能 &#xff08;1&#xff09;進程和線程的管理&#xff1a;進程線程的狀態、控制、同步互斥、通信調度等 (2&#xff09;存儲管理&#xff1a;分配/回收、地址轉換、存儲保護等 (3&#xff09;文件管理&#xff1a;文件目錄、文件操作、磁盤…

Python爬蟲第22節- 結合Selenium識別滑動驗證碼實戰

目錄 一、引言 二、滑動驗證碼原理與反爬機制 2.1 驗證碼原理 2.2 反爬機制 三、工程實戰&#xff1a;滑動驗證碼識別全流程 3.1 工程準備 3.1.1 環境依賴 3.1.2 目標網站與驗證碼識別案例 3.2 核心破解流程 3.2.1 自動化打開網頁與登錄 3.2.2 獲取驗證碼圖片&#…

NSSCTF-[NISACTF 2022]huaji?

下載附件得到文件 放到kali里面看看 發現是一張圖片 用binwalk命令對其進行分離 發現需要密碼 用010打開圖片進行查看 對其進行解密 分別得到 ctf_NISA_2022 nisa_2022 發現ctf_NISA_2022是密碼 得到flag NSSCTF{Nls_FumYEnnOjy}