1. 程式人生 > >c++ 以二進位制和以文字方式讀寫檔案的區別

c++ 以二進位制和以文字方式讀寫檔案的區別

  在c++專案開發中,時常涉及到檔案讀寫操作。因此在這裡先簡單梳理和回顧一下文字模式和二進位制模式在進行檔案讀寫上的區別。

  1.linux平臺下文字檔案和二進位制檔案的讀寫

    在linux平臺下進行檔案讀寫時,文字模式和二進位制模式沒有區別。在檔案讀寫時,呼叫fopen,無論以文字模式還是二進位制模式開啟檔案,之後在進行檔案讀取和寫入,其結果都是一樣的。因此,在linux平臺下,以二進位制方式建立的檔案和寫入的檔案,在以後的訪問中,使用二進位制或者文字方式均可以進行正確的讀寫;同理,以文字方式建立的檔案和寫入的檔案,使用二進位制或者文字模式均可以進行正確的讀寫。請看一下例子:

    1.1 以二進位制模式開啟並寫入檔案

 1 //例子1:以二進位制模式開啟並寫入檔案
 2 #include <stdio.h>
 3 #include <iostream>
 4 using namespace std;
 5 int main()
 6 {
 7     int m=97;
 8     char s[] = "中國\n";
 9     FILE *fp = fopen("testBin.txt","wb");   //二進位制模式
10     if(NULL == fp )
11     {
12         return -1;
13     }
14     int successCont=fwrite(&m,sizeof
(int),1,fp); 15 if(successCont!=1) 16 cout<<"error"<<std::endl; 17 fwrite(s,sizeof(char),sizeof(s),fp); 18 fprintf(fp,"%d",m); //格式化輸出 19 fclose(fp); 20 return 1; 21 22 }

    檢視testBin.txt的資料,如下:

      

    其中: 0061 0000為m的值97(我的計算機是小端序,檔案的預設編碼是utf-8), b8e4 e5ad bd9b為漢字中國對應的utf-8編碼,0a為\n字元,3739 為字元7和9對應的ASCII值。

  1.2 以文字模式開啟並寫入檔案

    修改1.1節中的第9行程式碼為FILE *fp = fopen("testTxt.txt","w"); //文字模式。然後重新執行程式,檢視testTxt.txt檔案,結果如下:

      

       可以發現,以文字模式開啟並寫入檔案的結果和通過二進位制模式寫入檔案的結果一致。

  2.windows平臺下文字檔案和二進位制檔案的讀寫

    下面,簡單對比一下windows平臺上以文字模式和二進位制模式進行檔案讀寫的差異。

    2.1 以文字模式開啟並寫入檔案

      如果以“文字”方式開啟檔案,當讀取檔案的時候,系統會將所有的"/r/n"轉換成"/n";當寫入檔案的時候,系統會將"/n"轉換成"/r/n"寫入。請看以下示例:

 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 int main()
 5 {
 6     int m = 97;
 7     char s[] = "中國\n";
 8     FILE *fp = NULL;
 9     fopen_s(&fp,"winTxt.txt", "w");
10     if (NULL == fp)
11     {
12         return -1;
13     }
14     int successCont = fwrite(&m, sizeof(int), 1, fp);
15     if (successCont != 1)
16         cout << "error" << std::endl;
17     fwrite(s, sizeof(char), sizeof(s), fp);
18     fprintf(fp, "%d", m);
19     fclose(fp);
20     return 1;
21 
22 }

        winTxt.txt結果如下:

      

    對比linux平臺可以發現,\n(0x0a)前果然多了一個字元\r(0x0d)。

      2.2 以二進位制模式開啟並寫入檔案

     如果以"二進位制"方式開啟檔案,則讀/寫都不會進行這樣的轉換。

     把2.1節中的第9行程式碼改為:fopen_s(&fp,"winBin.txt", "wb");執行,檢視winBin.txt,結果如下:

      

    因此,在windos平臺下開發中,以二進位制模式建立並寫入的檔案,在讀取時,為了防止讀檔案出錯,建議以二進位制模式進行讀取;同樣的道理,以文字模式建立並寫入的檔案,在讀取該檔案時,建議以文字模式進行讀取。

相關推薦

c++ 二進位制文字方式檔案區別

  在c++專案開發中,時常涉及到檔案讀寫操作。因此在這裡先簡單梳理和回顧一下文字模式和二進位制模式在進行檔案讀寫上的區別。   1.linux平臺下文字檔案和二進位制檔案的讀寫     在linux平臺下進行檔案讀寫時,文字模式和二進位制模式沒有區別。在檔案讀寫時,呼叫fopen,無論以文字模式還是二進位制

C語言二進位制方式檔案資料

fwrite(buffer, size, count,fp):以二進位制的形式向指定的檔案中寫入若干資料項(由count決定),返回實際寫入的資料項數目,各引數含義如下: buffer:一個儲存區的起始地址,以該地址開始的儲存區的資料即是儲存到檔案中的資料,可以是陣列或指標型別; siz

ApolloStudio高手之路(3):用Python最優雅簡潔的方式支援Modbus RTU/TCP協議的裝置資料

縱觀整個工業界生態鏈,可能Modbus協議(包括了通過串列埠方式連線的Modbus RTU協議和通過網路傳輸的Modbus TCP協議,這裡統稱為Modbus)作為一種工業領域通訊協議的業界標準在所有裝置互聯的協議群中獨佔鰲頭,也許正是因為其相較與其他協議的優越性(1.公開發表並且無版權要求;2

文字方式二進位制方式檔案的windows區別總結

一、寫     二進位制方式寫,當遇到整型和浮點數時是以小端模式的整個十六進位制值寫入到檔案中(和記憶體中一樣),當遇到ascii字元和utf-16(unicode)型別的字元時候是用該編碼的key值(unicode 16位元組時候不作為小端模式而是書寫模式儲存)寫入到檔

c++ premier Plus書--C++列舉switch, cin/cout/檔案

C++中switch和列舉結合使用: #include "iostream" using namespace std; // 建立一個列舉型別常量, 實際對應的是0~2 enum {red, orange, yellow}; int main() { cout << "Ente

文字模式檔案中\r\n的問題

原文地址:http://blog.sina.com.cn/s/blog_65db99840100kidc.html DOS檔案(windows格式檔案)中,按一下ENTER就是輸入了\r\n,這就是回車換行 MAC檔案裡,用\r換行 UNIX檔案裡,用\n換行 自己嘗試了

OLE方式EXCEL的C++類【轉載】

◆C++中的【L"https://msdn.microsoft.com/library"】。 這個是C++標準規定的寫法。詳見以下連結: ◆VC中的 _T 和 _TEXT 和 TEXT 巨集。 _T和_TEXT和TEXT是通用的文字巨集,它們在被使用的時候,需要和字串

C語言資料塊的形式檔案

C語言以資料塊的形式讀寫檔案 fgets() 有侷限性,每次最多隻能從檔案中讀取一行內容,因為 fgets 遇到換行符就結束讀取。如果希望讀取多行內容,需要使用 fread 函式;相應地寫入函式為 fwrite。 fread() 函式用來從指定檔案中讀取塊資料。所謂塊資料,也就是若干個位

C語言字串的形式檔案

C語言以字串的形式讀寫檔案 fgetc() 和 fputc() 函式每次只能讀寫一個字元,速度較慢;實際開發中往往是每次讀寫一個字串或者一個數據塊,這樣能明顯提高效率。 讀字串函式fgets fgets() 函式用來從指定的檔案中讀取一個字串,並儲存到字元陣列中,它的原型為: c

ApolloStudio高手之路(6):用Python極簡方式OPC DA、OPC UA資料並實現UI控制元件自動繫結重新整理顯示

OPC(OLE for Process Control, 用於過程控制的OLE)是一個工業標準,OPC是為了連線資料來源(OPC伺服器)和資料的使用者(OPC應用程式)之間的軟體介面標準。資料來源可以是PLC,DCS,條形碼讀取器等控制裝置。隨控制系統構成的不同,作為資料來源的OPC伺服器既可以

雅虎面試題─把十進位制數(long型)分別二進位制十六進位制形式輸出,不能使用printf系列

程式設計實現:把十進位制數(long型)分別以二進位制和十六進位制形式輸出,不能使用printf系列。 實現了unsigned long型的轉換。 // 十進位制轉換為二進位制,十進位制數的每1bit轉換為二進位制的1位數字 char *int_to_bin(unsigne

C#檔案宜取方式.md

C#讀寫檔案宜取方式 首先,不推薦用如下方式讀寫 //讀 using (FileStream fs = File.OpenRead(filePath)) { byte[] b = new byt

JavaUTF-8編碼檔案

以utf-8編碼寫入檔案: FileOutputStream fos = new FileOutputStream("test.txt"); OutputStreamWriter osw =

c++檔案設定的位置

檔案定位  和C的檔案操作方式不同的是,C++ I/O系統管理兩個與一個檔案相聯絡的指標。一個是讀指標,它說明輸入操作在檔案中的位置;另一個是寫指標,它下次寫操作的位置。每次執行輸入或輸出時,相應的指標自動變化。所以,C++的檔案定位分為讀位置和寫位置的定位,對應的成員函式是

java位元組流形式檔案

java中以位元組流的形式讀取檔案採用的是FileInputStream,將指定路徑的檔案以位元組陣列的形式迴圈讀取,程式碼如下:public void ReadFileByByte(String p

Qt---多種方式二進位制檔案

將文字資料寫入二進位制檔案,然後從二進位制檔案中讀出,還原為文字資料 #include "mainwindow.h" #include <QApplication> #include &l

fstream與 C 風格(例如fread fwrite )兩種檔案方法的效率比較

為了探錄c++ 風格的fstream與 C 風格(例如fread 和 fwrite )兩種讀寫檔案的方法的效率,我特意做了兩個實驗。 我的機器是Windows XP, Visual Studio 2008 1. 測試寫檔案速度 程式設計思路: 將TEST_SIZE個

四種檔案方式:系統呼叫(open/read/write),C語言(fopen,fgets, fputs),C++(ifstream, ofstream getline,)泛型演算法

第一種方法是系統呼叫 (1)open系統呼叫    原型:        #include <sys/types.h>        #include <sys/stat.h>        #include <fcntl.h>     

用read()write()二進位制檔案

#include<iostream> #include<fstreeam> #include<cstring> #include<cstdlib> us

java中split"."分隔"\"分隔

在使用String中的split()方法是要注意: public String[] split(String regularExpression) { return split(regularExpression, 0); } 可以看到它裡面使用的是