文件IO筆試題

目錄

  • 前言
  • 一、核心概念:
  • 二、關鍵操作步驟:
  • 三、為什么需要文件IO?
  • 四、常見類型:
  • 五、標準IO源碼
  • 六、筆試真題和練習
    • 1.
      • 代碼實現1
      • 代碼實現2
    • 2.
      • 代碼實現
    • 3.
      • 代碼實現
  • 4.
      • 代碼實現
  • 5.
      • 代碼實現
  • 七、總結

前言

文件IO(文件輸入/輸出) 是指計算機程序與外部存儲設備(如硬盤、SSD、U盤等)上的文件進行數據交換的過程。簡單來說,就是程序從文件中讀取數據(Input)或將數據寫入文件(Output)。文件IO這個板塊我們會學習很多個接口,所以說我們長時間不用就會忘記,一定要會用man指令查手冊,必須要回看得懂源碼。

在這里插入圖片描述

一、核心概念:

文件(File):
存儲在持久化介質(如硬盤)上的數據集合,具有名稱和路徑。可以是文本、圖片、音頻、程序等任何形式。

輸入(Input)
程序從文件讀取數據到內存(如變量、數據結構)。例如:讀取配置文件、加載圖片數據。

輸出(Output):
程序將內存中的數據寫入文件。例如:保存用戶設置、導出計算結果。

二、關鍵操作步驟:

打開文件(Open):
建立程序與文件的連接,指定操作模式(讀、寫、追加等)。

讀寫數據(Read/Write):

**讀:**將文件內容傳輸到程序內存。

**寫:**將程序內存中的數據寫入文件。

關閉文件(Close):
釋放資源,確保數據完整保存(重要!未關閉可能導致數據丟失)。

三、為什么需要文件IO?

**持久化存儲:**內存數據在程序關閉后消失,文件可長期保存。

**數據共享:**不同程序或用戶可通過文件交換數據。

**處理大數據:**內存有限,文件可分批讀取/寫入海量數據。

四、常見類型:

**文本文件IO:**處理字符數據(如 .txt, .csv),需注意編碼(UTF-8等)。

**二進制文件IO:**直接處理字節(如圖片 .jpg、可執行程序),無編碼轉換。

五、標準IO源碼

因為標準IO的接口都是在Linux的man手冊的第3長,在Linux系統輸入man 3 fopenman 3 fread,等常用的函數接口

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

六、筆試真題和練習

1.

請添加圖片描述

代碼實現1

這次我用的是fopen打開文件,fclose關閉文件,fgetc一個一個字符讀取文件中的內容,所以光標會自己向后偏移。

#include <stdio.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{if(argc != 2){printf("argument is invailed!\n");exit(1);}FILE* file = fopen(argv[1], "rb");if(!file){printf("file open failed!\n");exit(1);}int cnt = 0;while(1){if(fgetc(file) == EOF){break;}cnt++;}printf("file %s size is %d byte\n",argv[1],cnt);fclose(file);return 0;
}

代碼實現2

這個代碼是利用fseek函數將文件的光標移動到文件末尾,然后用ftell函數記錄當前光標位置到文件開頭的偏移值。

#include <stdio.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{if(argc != 2){printf("argument is invailed!\n");exit(1);}FILE* file = fopen(argv[1], "rb");if(!file){printf("file open failed!\n");exit(1);}fseek(file,0,SEEK_END);printf("file %s size is %ld byte\n",argv[1], ftell(file));fclose(file);return 0;
}

2.

在這里插入圖片描述### 代碼實現
用到了fread和fwrite接口,定義一個緩沖區(buffer),記錄讀寫次數,每次讀寫前把緩沖區清空。

代碼實現

/** Copyright (c)* * date: 2025-7-22* * author: Charles* * function name : copyFile** function: 把一個文件的所有內容拷貝到另一個文件*/#include <stdio.h>
#include <stdlib.h>
#include <strings.h>#define BUFFERSIZE 512int main(int argc, char const *argv[])
{long file_src_size = 0; 		//源文件的總字節數long remainder = 0; 			//總字節數與緩沖區字節數的余數int  cnt = 0;					//用源文件總字節數除以緩沖區字節數,也就是再循環里的讀寫次數long file_des_size = 0;         //目標文件的總字節數char buffer[BUFFERSIZE] = {0};	//緩沖區if(argc != 3){printf("argument is invailed!\n");exit(1);}FILE* file_src = fopen(argv[1], "rb");FILE* file_des = fopen(argv[2], "wb");if(!file_src || !file_des){printf("file open failed!\n");exit(1);}fseek(file_src, 0, SEEK_END);file_src_size = ftell(file_src);fseek(file_src, 0, SEEK_SET);printf("file_src [%s] size is [%ld] byte\n",argv[1], file_src_size);cnt = file_src_size / BUFFERSIZE;remainder = file_src_size % BUFFERSIZE;while(cnt--){memset(buffer, 0, BUFFERSIZE);size_t n = fread(buffer, 1, BUFFERSIZE, file_src);fwrite(buffer, 1, n, file_des);}if(remainder){memset(buffer, 0, BUFFERSIZE);size_t n = fread(buffer, 1, remainder, file_src);fwrite(buffer, 1, n, file_des);}fseek(file_des, 0, SEEK_END);file_des_size = ftell(file_des);fseek(file_des, 0, SEEK_SET);printf("file_des [%s] size is [%ld] byte\n",argv[2], file_des_size);fclose(file_src);fclose(file_des);return 0;
}

3.

請添加圖片描述

代碼實現

在一個循環里用open函數,記錄直到函數返回值為-1為止。

/** Copyright (c)* * date: 2025-7-22* * author: Charles* * function name : FileOpenCount** function: 測試文件打開次數*/#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define BUFFERSIZE 512int main(int argc, char const *argv[])
{if(argv != 2){printf("argument is invailed!\n");exit(1);}int cnt = 0;while(open(argv[1], O_RDWR) != -1){cnt++;}printf("file can be open %d count!\n",cnt + 3);//為什么加3,因為在打開這個文件的時候系統會自動打開標準輸入,標準輸出,錯誤這個文件return 0;
}

4.

請添加圖片描述

像這個獲取時間的api,都是系統IO。

代碼實現

/** Copyright (c)* * date: 2025-7-23* * author: Charles* * function name : time_log.c** function: 每秒鐘打印當前日期到log.txt文件中*/#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>int main(int argc, char const *argv[])
{while(1){time_t t = time(NULL);struct tm *tm_info = localtime(&t);char day[8][20] = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};char buffer[256];snprintf(buffer,sizeof(buffer),"%d年%02d月%02d日 %s %02d:%02d:%02d",tm_info->tm_year + 1900,tm_info->tm_mon + 1,tm_info->tm_mday,day[tm_info->tm_wday],tm_info->tm_hour,tm_info->tm_min,tm_info->tm_sec);FILE* file = fopen("./log.txt","a");if(!file){perror("fopen");exit(-1);}fputs(buffer, file);fclose(file);sleep(1);}return 0;
}

5.

請添加圖片描述
這題可以看看bmp的文件存儲格式圖。然后要注意的是系統默認會有一個對齊機制,就比如說bmp_header這個結構體如果取消對齊大小為14字節,如果不取消大小就為16字節。
請添加圖片描述

代碼實現

/** Copyright (c)* * date: 2025-7-23* * author: Charles* * function name : getBMP.c** function: 獲取bmp圖片大小,像素寬度和高度信息*/#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>#pragma  pack(1) 	//取消字節對齊struct bmp_header{char s[2];int size;short a;short b;int c;
};struct bmp_info{int a;int width;int heigth;short a1;short b1;int off1;int off2;int off3;int off4;int off5;int off6;
};#pragma  pack(0)int main(int argc, char const *argv[])
{// int bmp_size = 0;		//bmp圖片的總字節數// int bmp_width = 0;		//bmp圖片的像素寬度// int bmp_heigth = 0;		//bmp圖片的像素高度if(argc != 2){			//參數錯誤處理printf("argument fail! \n");exit(-1);}int bmp_fd = open(argv[1], O_RDWR);if(bmp_fd == -1){printf("open file : %s fail\n", argv[1]);exit(-1);}// char header[2] = {0};// read(bmp_fd, header, 2);struct bmp_header bh;struct bmp_info bi;read(bmp_fd, &bh, 14);read(bmp_fd, &bi, 40);if(bh.s[0] != 'B' || bh.s[1] != 'M'){		//判斷寫入的兩個字符是否是BM開頭的printf("open file not bmp\n");exit(-1);}printf("bmp size is %d byte\n", bh.size);printf("bmp width is %d px\n", bi.width);printf("bmp heigth is %d py\n", bi.heigth);// lseek(bmp_fd, 2, SEEK_SET);// read(bmp_fd, &bmp_size, 4);// printf("bmp size is %d byte\n", bmp_size);// lseek(bmp_fd, 18, SEEK_SET);// read(bmp_fd, &bmp_width, 4);// printf("bmp width is %d byte\n", bmp_width);// lseek(bmp_fd, 18 + 4, SEEK_SET);// read(bmp_fd, &bmp_heigth, 4);// printf("bmp heigth is %d byte\n", bmp_heigth);close(bmp_fd);return 0;
}

七、總結

文件IO是程序與外部存儲交互的橋梁,通過 讀取(Input) 和 寫入(Output) 實現數據的持久化和重用,是幾乎所有軟件的基礎功能。不同編程語言有各自的API(如C的 fopen/fread、Java的 FileInputStream、Python的 open()),但核心邏輯一致。

在這里插入圖片描述

希望各位靚仔靚女點贊,收藏,關注多多支持,我們共同進步,后續我會更新更多的面試真題,你們的支持將是我前進最大的動力。

在這里插入圖片描述

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

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

相關文章

前端學習 5:DFT

DFT技術 DFT &#xff08;design for testability&#xff09;&#xff1a;指在設計系統和電路的同時&#xff0c;考慮測試的需求&#xff0c;通過增加一定的硬件開銷&#xff0c;獲得最大可測性的設計過程。&#xff08;因為增加了硬件&#xff0c;所以也帶來了不足&#xff…

最長遞增子序列(LIS)問題詳解

最長遞增子序列LIS問題詳解一、問題定義與核心特征1.1 問題描述1.2 核心特征二、基礎解法&#xff1a;動態規劃&#xff08;DP&#xff09;2.1 解法思路2.2 Java代碼實現2.3 復雜度分析三、優化解法&#xff1a;二分查找貪心3.1 核心思路3.2 二分查找的作用3.3 Java代碼實現代碼…

什么是HTTP長連接、短連接?誰更能抗DoS攻擊?

想象你在快餐店點餐&#xff1a; 你&#xff1a;“一個漢堡”收銀員&#xff1a;“好的&#xff0c;15元”交易結束&#xff0c;你離開隊伍你想加杯可樂&#xff0c;重新排隊你&#xff1a;“一杯可樂”收銀員&#xff1a;“好的&#xff0c;8元”再次離開… 這種每次溝通后立即…

微軟徽標認證是什么?如何快速獲取驅動簽名?

在Windows系統中安裝硬件驅動時&#xff0c;是否遇到過“無法驗證發布者”的警告&#xff1f;這正是驅動數字簽名在背后發揮作用。對于軟件開發者而言&#xff0c;驅動數字簽名不僅是系統兼容性的保障&#xff0c;更是企業品牌信任度的核心。一、驅動數字簽名的核心作用驅動數字…

Apache Ignite緩存基本操作

這段內容主要講解了 Apache Ignite 中緩存&#xff08;IgniteCache&#xff09;的基本操作&#xff0c;包括獲取緩存、創建緩存、銷毀緩存、執行原子操作以及異步操作等。下面我將用中文對這些內容進行詳細解釋&#xff0c;幫助你更好地理解。一、獲取緩存實例&#xff08;Gett…

最新基于R語言結構方程模型分析與實踐技術應用

現代統計學理論和方法的不斷完善&#xff0c;使科研工作對統計方法的要求也越來越高&#xff0c;面對紛繁復雜的數據&#xff0c;如何選擇最為合適的數據分析方法已成為科研工作者&#xff0c;尤其是廣大剛處于科研生涯起步階段的研究生們最為棘手問題。隨著科學的發展&#xf…

物聯網_TDengine_EMQX_性能測試

一、Tdengine接口開發文檔 1、數據庫 1.創建數據庫 URL /dp/createdb/ method post 請求示例 {"db_name":"demo01" // 必填 }響應示例 // 成功 {"code": 1,"data": {"成功創建數據庫": "demo04"},"error…

從分析到優化:Amazon Q CLI 助力 EKS 網絡調用鏈剖析與運維實踐

1. 引言 在 Amazon EKS&#xff08;Elastic Kubernetes Service&#xff09;環境中&#xff0c;理解從 ALB&#xff08;Application Load Balancer&#xff09;到 Pod 的完整網絡調用鏈對運維人員至關重要。本文將展示如何利用 Amazon Q CLI 這一 AI 助手工具&#xff0c;通過…

Class10簡潔實現

Class10簡潔實現 import torch from torch import nn from d2l import torch as d2l# 輸入為28*28&#xff0c;輸出為10類&#xff0c;第1、2隱藏層256神經元 num_inputs, num_outputs, num_hiddens1, num_hiddens2 784, 10, 256, 256 # 第1個隱藏層丟棄率為0.2&#xff0c;第…

【多線程篇22】:ConcurrentHashMap的并發安全原理剖析

文章目錄一、HashMap 的“不安全”&#xff1a;問題的根源1. 數據結構回顧 (JDK 1.8)2. 并發下的致命缺陷&#xff1a;put 操作二、ConcurrentHashMap 的安全之道 (JDK 1.8)1. 核心數據結構2. 安全的 put 操作&#xff1a;分場景精細化加鎖3. 安全的 size() 計算&#xff1a;并…

【Java + Vue 實現圖片上傳后 導出圖片及Excel 并壓縮為zip壓縮包】

系統環境&#xff1a; Java JDK&#xff1a;1.8.0_202 Node.js&#xff1a;v12.2.0 Npm&#xff1a;6.9.0 Java后端實現 Controller /*** xxxx-導出* param response 返回信息體* param files 上傳的圖片文件* param param1 參數1* param param2 參數2*/PostMapping("/ex…

安科瑞:能源微電網助力工業園區“綠色”發展

朱以真近日&#xff0c;廈門市工業和信息化局印發工業園區綠色智慧微電網建設&#xff0c;擬開展全市工業園區綠色智慧微電網試點通知&#xff0c;那么對于如何實現綠色園區的建設是今天的話題。對工業園區綠色智慧微電網建設需求&#xff0c;其核心價值體現在“源-網-荷-儲-充…

VUE2 學習筆記3 v-on、事件修飾符、鍵盤事件

事件處理v-on用于事件交互。語法&#xff1a;v-on:要綁定的事件“事件觸發時執行的函數” &#xff08;函數這里可以寫括號&#xff0c;也可以不寫&#xff0c;沒有影響&#xff09;簡寫&#xff1a;:事件觸發時要執行的函數&#xff0c;在Vue配置參數中&#xff0c;通過method…

變換域通訊系統CCSK的matlab仿真

CCSK&#xff08;Cyclic Code Shift Keying&#xff09;通信系統的MATLAB仿真。實現完整的CCSK調制、AWGN信道傳輸和解調過程&#xff0c;并計算了誤碼率&#xff08;BER&#xff09;。 % CCSK通信系統仿真 clear; clc; close all;% 參數設置 L 31; % m序列…

技術演進中的開發沉思-40 MFC系列:多線程協作

今天說說MFC的線程&#xff0c;當年用它實現中間件消息得心應手之時&#xff0c;可以實現一邊實時接收數據&#xff0c;一邊更新界面圖表圖文信息&#xff0c;順滑得讓人想吹聲口哨。 MFC 多線程它像給程序裝上了分身術&#xff0c;讓原本只能 “單任務跑腿” 的代碼&#xff0…

高速公路自動化安全監測主要內容

近年來&#xff0c;隨著社會經濟的快速發展&#xff0c;高速公路的通車里程不斷增加&#xff0c;交通流量日益增大。與此同時&#xff0c;高速公路交通事故數量也呈現出一定的增長趨勢。這些事故不僅造成了大量的人員傷亡和財產損失&#xff0c;還嚴重影響了社會的穩定和經濟的…

完美解決 Ubuntu 中自定義啟動器圖標重復的問題(以 MATLAB 為例)

如果你在 Ubuntu 上為 MATLAB、PyCharm、Android Studio 或其他第三方應用創建了自定義啟動器&#xff0c;并把它固定到了左側的 Dock 欄&#xff0c;你很可能遇到過這個令人抓狂的場景&#xff1a; 當你滿心歡喜地點擊固定的圖標啟動程序后&#xff0c;Dock 欄上竟然“憑空”冒…

一文讀懂深度模型優化器,掌握煉丹工具

深度模型優化器是訓練神經網絡的核心工具&#xff0c;其目標是高效地找到損失函數的最小值。從基礎的隨機梯度下降&#xff08;SGD&#xff09;到結合一階動量修正與兩階段更新的Ranger&#xff0c;優化器的發展始終圍繞著加速收斂、提升穩定性、適應參數差異和增強泛化能力四大…

關于虛擬機部署的k8s集群calico組件在開機恢復快照時的問題

在恢復虛擬機開機快照的時候總會出現各種的網絡問題&#xff0c;連接不到自己的443端口&#xff0c;集群狀態異常等等&#xff0c;繞一圈都發現不了問題&#xff0c;其實根本就沒問題。虛擬機環境再現&#xff0c;恢復快照后的k8s環境&#xff0c;nfs莫名宕掉提示此報錯&#x…

從感知到決策:虛擬仿真系統與視覺算法融合下的多路RTSP視頻接入技術探究

1?? 背景概述 隨著國防信息化和智能化進程的不斷加快&#xff0c;虛擬仿真系統 與 智能視覺算法平臺 正逐步成為現代化裝備研發、測試驗證與戰術訓練的重要技術支撐。相比傳統的靜態建模或離線推演&#xff0c;新一代作戰仿真與智能系統更強調 實時性、感知能力與動態交互&a…