C語言文本模式和二進制模式

前言

本篇文章介紹一下C語言的文本模式和二進制模式

文本文件和二進制文件

從宏觀上看,無論是文本文件還是二進制文件,文件中保存的都是0和1的序列,因為磁盤只有這兩種狀態。不同的文件只是對0、1序列的解釋不同,如果文件內容是以字符編碼的方式保存到文件中的,無論是以哪種編碼方式,比如使用ascii編碼,unicode編碼都可以,這樣的文件就是文本文件,也就是文本文件中存在的是一個個字符。如果文件保存的是機器可以識別的數值在內存中的表示,或者是圖片、音頻等編碼的數據,那這種文件就是二進制文件,舉個簡單的例子,對于數字

int i=10000;

如果我們用文本方式保存該值,應該保存’1’、‘0’、‘0’、‘0’、'0’五個字符,但是如果以二進制表示呢,我們只需要保存i的二進制表示
00000000 00000000 00100111 00010000
按照小端法保存依此應該是00010000 00100111 00000000 00000000

C語言的文本模式和二進制模式

C語言之所以要區分文本模式和二進制模式,主要原因就是不同的平臺對文本文件的操作不一樣,看下面這段代碼:

#include <stdio.h>
int main(void)
{printf("\\r=%hhd,\\n=%hhd\n",'\r','\n');FILE* file = fopen("test.d", "w");fprintf(file, "A\nB");fclose(file);file = fopen("test.d", "rb");char ch=' ';while((ch=getc(file))!=EOF){printf("%c,%hhd\n",ch,ch);}fclose(file);return 0;
}

在mac上顯示結果如下:

\r=13,\n=10
A,65,10
B,66

在win上顯示結果如下:

\r=13,\n=10
A,65
,13,10
B,66

可以發現,在mac上以文本模式存儲換行符存儲的是\n(據說老版mac存的是\r),在windows系統上存儲的是\r\n,鑒于此,C標準針對文本模式讀取寫入換行符的時候進行了處理,讀取換行符的時候,統一轉換成\n,寫入換行符的時候,根據不同系統寫入不同的數據,比如windows就寫入\r\n,把上面的例子讀取文件從二進制模式修改為文本模式

#include <stdio.h>
int main(void)
{printf("\\r=%hhd,\\n=%hhd\n",'\r','\n');FILE* file = fopen("test.d", "w");fprintf(file, "A\nB");fclose(file);file = fopen("test.d", "r");char ch=' ';while((ch=getc(file))!=EOF){printf("%c,%hhd\n",ch,ch);}fclose(file);return 0;
}

在windows上執行結果如下:

\r=13,\n=10
A,65,10
B,66

可以發現\r\n轉換成了\n

還有一點需要注意,對于文本模式和二進制模式,我們使用ftell獲取字節數大小的時候

  • windows系統換行符算兩個字節,不管文本模式還是二進制模式,mac系統換行符算一個字節
  • 對于windows系統,文本模式獲取的換行符為雖然算兩個字符,但是打印出來的都是\n
    看下面的例子:
#include <stdio.h>
int main(void)
{printf("\\r=%hhd,\\n=%hhd\n", '\r', '\n');FILE* file = fopen("test.d", "r");fseek(file, 0, SEEK_END);long size = ftell(file);for (int i=1;i<=size;i++){fseek(file, -i, SEEK_END);printf("%hhd\n",getc(file));}printf("size:%ld\n", size);fclose(file);return 0;
}

在mac系統下,輸出的字節大小都是3,
在windows系統下,輸出的字節大小是4,文本模式輸出如下:

\r=13,\n=10
66
10
10
65
size:4

二進制模式輸出如下:

\r=13,\n=10
66
10
13
65
size:4

總結

我們一般使用二進制模式保存的數據都是我們定義好的數據結構數據,這種數據是不需要換行符這種東西的,基本是為了數據的安全或者更緊湊。我們自己負責數據的修改和解析

如果是為了顯示或者便于別人編輯的數據,建議保存成文本文件。

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

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

相關文章

AtCoder ABC周賽2023 11/4 (Sat) E題題解

目錄 原題截圖&#xff1a; 原題翻譯 題目大意&#xff1a; 主要思路&#xff1a; 代碼&#xff1a; 原題截圖&#xff1a; 原題翻譯 題目大意&#xff1a; 給你一個數組&#xff0c;給你一個公式&#xff0c;讓你選k個元素&#xff0c;用公式算出最終得分。 主要思路&am…

X86匯編語言:從實模式到保護模式(代碼+注釋)--c6

X86匯編語言&#xff1a;從實模式到保護模式&#xff08;代碼注釋&#xff09;–c6 標志寄存器FLAGS&#xff1a; 6th&#xff1a;ZF位&#xff08;Zero Flag&#xff09;&#xff1a;零標志&#xff0c;執行算數或者邏輯運算之后&#xff0c;會將該位置位。10th&#xff1a;D…

安全運營 -- 100個藍隊溯源技巧(逐步更新)

0x00 背景 記錄一些常用的入侵排查命令和日常運維思路分享。(排名不分先后,逐步更新ing) 0x01 linux 查詢所有用戶計劃任務 cat /etc/passwd|cut -f 1 -d : |xargs -I {} crontab -l -u {} 0x02 排查linux記錄密碼后門 strace 監聽ssh來源流量記錄密碼后門(本機輸入的密碼記…

Shell數組函數:數組——數組和循環(三)

數組統計性別 一、定義性別文件 [root192 ~]# vim sex.txt jack m alice f tom m 二、定義腳本統計性別 [root192 ~]# vim sex.sh #!/bin/bash declare -A sex while read line dotypeecho $line | awk {print $2}let sex[$type] done < sex.txtfor i in ${!sex[]} doecho…

Linux基礎——進程初識(一)

1. 硬件 ①馮諾依曼體系 我們常見的計算機&#xff0c;如筆記本。我們不常見的計算機&#xff0c;如服務器&#xff0c;大部分都遵守馮諾依曼體系。其詳細結構如下圖所示 在這里有幾點要說明 1. 這里的儲存器實際上指的是內存 2. 輸入設備與輸出設備都屬于外設 常見的輸入設備…

實現SQL server數據庫完整性

1.創建一個數據庫名為“erp” 主數據文件&#xff1a;初始容量為5MB&#xff0c;最大容量為50MB&#xff0c;遞增量為1MB&#xff0c;其余參數自設。事務日志文件&#xff1a;初始容量為3MB&#xff0c;最大容量為20MB&#xff0c;遞增量為10%&#xff0c;其余參數自設。 創建…

與脾氣不太好的領導,相處原則和相處技巧分享

前言 工作上我看到有的人擅長和各種類型領導相處&#xff0c;而有的人則和領導相處不愉快&#xff0c;不懂靈活變通的人 和領導相處出現沖突時則是當面懟領導&#xff0c;不給領導面子&#xff0c;之后被領導打壓&#xff0c;甚至有的人和領導相處 不和離開等等&#xff0c;…

多個HTML屬性

在HTML中&#xff0c;屬性用于提供有關HTML元素的附加信息。在這篇文章中你將學習多個HTML屬性&#xff0c;它們可以增強網站的視覺吸引力。 接下來開始吧&#xff01;&#x1f680; Accept 屬性 您可以將accept屬性與<input>元素&#xff08;僅用于文件類型&#xff…

SPECPOWER2008

一、前言# 1、軟件說明# 官網&#xff1a;SERT套件用戶指南2.0.5SPECpower介紹SPEC基準及工具SPECpower_ssj2008測試結果SPECpower_ssj2008-Design_ccs - SPEC# SPEC&#xff08;the Standard Performance Evaluation Corporation&#xff09;是一個由計算機硬件廠商、軟件公…

jsp頁面通過class或者id獲取a標簽上的屬性的值

要通過class和id兩種方式獲取a標簽上的某個屬性的值&#xff0c;或者給其賦值&#xff0c;可以使用JavaScript。以下是兩種方法的示例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

[ 藍橋杯Web真題 ]-Markdown 文檔解析

目錄 介紹 準備 目標 規定 思路 補充知識 解法參考 介紹 Markdown 因為其簡潔的語法大受歡迎&#xff0c;已經成為大家寫博客或文檔時必備的技能點&#xff0c;眾多博客平臺都提倡用戶使用 Markdown 語法進行文章書寫&#xff0c;然后再發布后&#xff0c;實時的將其轉化…

【Element-ui】Icon 圖標與Button 按鈕

文章目錄 前言一、Icon 圖標1.1 作用1.2 使用方法1.3 圖標集合 二、Button 按鈕2.1 基礎用法2.2 禁用狀態2.3 文字按鈕2.4 圖標按鈕2.5 按鈕組2.6 加載中2.7 不同尺寸 總結 前言 在前端開發中&#xff0c;界面的設計和交互是至關重要的一部分。一個直觀、易用的界面往往離不開…

AcGeLinearEnt2d::getPerpLine函數

AcGeLinearEnt2d::getPerpLine函數是AutoCAD圖形庫&#xff08;AutoCAD Geometry Library&#xff0c;即AcGe&#xff09;中的一個成員函數&#xff0c;用于獲取一個通過指定點且垂直于當前直線或線性實體的無限長直線。 函數的參數和返回值說明如下&#xff1a; const AcGeP…

js寫旋轉的時鐘動態

目錄 1、css代碼 2.html代碼 3.js代碼 1、css代碼 .box {position: relative;width: 600px;height: 600px;background: url(./images/clock.jpg) no-repeat center;}.hour,.minute,.second {position: absolute;left: 0;top: 0;width: 100%;height: 100%;}.hour {background…

上個月暴漲34.6%后,SoundHound AI股票現在還能買入嗎?

來源&#xff1a;猛獸財經 作者&#xff1a;猛獸財經 揭開SoundHound AI股價波動的原因 S&P Global Market Intelligence的數據顯示&#xff0c;在擺脫了10月份的大幅下跌后&#xff0c;SoundHound AI的股價在11月份實現了34.6%的漲幅。 原因是該公司公布了穩健的第三季…

英文論文查重復率網址

大家好&#xff0c;今天來聊聊英文論文查重復率網址&#xff0c;希望能給大家提供一點參考。 以下是針對論文重復率高的情況&#xff0c;提供一些修改建議和技巧&#xff1a; 英文論文查重復率網址 在撰寫英文論文時&#xff0c;查重是確保論文原創性和質量的重要環節快碼論文…

國產化, 海量數據庫 VastbaseG100 兼容適配

背景&#xff1a; 客戶是國內某家電龍頭企業&#xff0c;應國產化政策要求&#xff0c; 系統需要適配國產數據庫&#xff0c; Vastbase G100 遇到問題&#xff1a; 1. 數據庫連接&#xff1a; Vastbase 是基于 postgresql 進行封裝&#xff0c; 所以理論上是兼容的&#…

Efficient physics-informed neural networks using hash encoding

論文閱讀&#xff1a;Efficient physics-informed neural networks using hash encoding Efficient physics-informed neural networks using hash encoding簡介方法PINN哈希編碼具有哈希編碼的 PINN 實驗Burgers 方程Helmholtz 方程N-S 方程訓練效率對比 總結 Efficient physi…

容器資源視圖隔離 —— 筑夢之路

先做個記錄&#xff0c;抽空再整理 K8s 部署 Lxcfs 準入控制器&#xff0c;實現容器中資源單獨可見 - 「Johny」PlayGround Kubernetes 中利用 LXCFS 控制容器資源可見性 - 碼農教程 容器資源可視化隔離的實現方法_51CTO博客_容器隔離技術 Lxcfs在容器集群中的使用-騰訊云開…

06 JQuery調用接口

文章目錄 一、Qs.js庫介紹1. Qs簡介2. Qs.parse3. Qs.stringify 二、jQuery調用接口1. 增加&#xff08;Create&#xff09;2. 刪除&#xff08;Delete&#xff09;3. 讀取&#xff08;Read&#xff09;4. 更新&#xff08;Update&#xff09; 三、示例 一、Qs.js庫介紹 1. Qs…