c語言讀取二進制文件
㈠ c語言中rb+什麼意思
在C語言中,rb+的含義如下:
rb+表示以讀寫模式打開一個二進制文件,且該文件必須存在。
- 讀寫模式:這意味著你可以對文件進行讀取操作,也可以進行寫入操作。與只讀模式或只寫模式不同,rb+模式允許你同時執行這兩種操作。
- 二進制文件:這表明文件是以二進制形式打開的,而不是文本形式。二進制文件通常用於存儲非文本數據,如圖像、音頻文件或程序的可執行代碼。在處理二進制文件時,數據以位元組為單位進行讀寫,而不是按字元處理。
- 文件必須存在:使用rb+模式打開文件時,如果指定的文件不存在,操作將失敗。這與wb+模式不同,後者在文件不存在時會創建一個新文件。
簡而言之,rb+模式在C語言中用於打開現有的二進制文件,以便進行讀寫操作。
㈡ C語言中 fp = fopen(filename, 「rb」); 那個rb是什麼意思啊
C語言中 fp = fopen(filename, 「rb」),里的rb是指:打開一個二進制文件,文件必須存在,只允許讀。
fphzk=fopen("c:\hzk16","rb")是打開C驅動器磁碟的根目錄下的文件hzk16,按二進制方式進行讀操作。兩個反斜線「\ 」中的第一個表示轉義字元,第二個表示根目錄。
(2)c語言讀取二進制文件擴展閱讀
fp = fopen(filename, 「rb」延伸
1、resourcefopen ( string filename, string mode, [ bool use_include_path, [resource zcontext]] ),fopen() 函數打開一個文件或 URL。如果 fopen() 失敗,它將返回 FALSE 並附帶錯誤信息。您可以通過在函數名前面添加一個 '@' 來隱藏錯誤輸出。
2、fopen() 將 filename 指定的名字資源綁定到一個流上。如果 filename 是 "scheme://..." 的格式,則被當成一個 URL,PHP 將搜索協議處理器(也被稱為封裝協議)來處理此模式。
3、如果該協議尚未注冊封裝協議,PHP 將發出一條消息來幫助檢查腳本中潛在的問題並將 filename 當成一個普通的文件名繼續執行下去。
㈢ 如何用Java或C語言解析二進制文件為文本文件
在學習C語言的fopen()函數時,我們了解到它的第二個參數是一個標志字元串。如果字元串中包含'b',則表示是以二進制(binary)文件模式打開,否則是以文本文件模式打開。那麼,什麼是文本文件,什麼是二進制文件呢?從文件編碼的角度來看,文件可以分為ASCII碼文件和二進制碼文件兩種。
ASCII文件通常被稱為文本文件,這種文件在磁碟中每個字元對應一個位元組,用於存放對應的ASCII碼。例如,數字5678的存儲形式為:ASCII碼:00110101 00110110 00110111 00111000,每個位元組分別代表一個數字。ASCII碼文件可以在屏幕上按字元顯示,例如源程序文件就是ASCII文件,使用DOS命令TYPE可顯示文件內容,因此能讀懂文件內容。
二進制文件則是按照二進制的編碼方式來存儲文件的,例如數字5678的存儲形式為00010110 00101110,只佔兩個位元組。二進制文件雖然也可以在屏幕上顯示,但其內容無法直接閱讀。C系統在處理這些文件時,並不區分類型,都看成是字元流,按位元組進行處理。輸入輸出字元流的開始和結束只由程序控制而不受物理符號(如回車符)的控制。
文本文件與二進制文件在系統存儲上實際上並沒有什麼區別,都是以二進制的方式存儲於硬碟上。之所以分二進制文件和文本文件,主要是邏輯上的區分,文本文件更易於人工閱讀。站在編程的角度看,文本文件是基於字元編碼過的,常見的有ascii編碼、gbk編碼、unicode編碼等,文本工具直接打開即可閱讀。而二進制文件是基於值的編碼,這個值到底是什麼,完全可自定義。
如果用Java編程,可能就不會遇到以二進制打開和文本文件打開這兩種方式了。Java中有字元流和位元組流,字元流是對位元組流的封裝,有編碼解碼,而位元組流操作的則是byte數組。Python的文件讀寫方式則更貼近C。因為Python和Java底層都是C,所以有必要弄清C的讀寫文件方式。
在Windows和DOS系統中,狹義的文本文件是指擴展名為.txt的文件。實際上,那些沒有規定格式的,由可理解的ASCII及其他編碼文字組成的文件都是文本文件,如C源程序文件、HTML超文本、XML。除此之外的其他文件都是二進制文件,如Word文件DOC、圖像格式文件JPG。
實際上,fopen()的b標志不但可以打開二進制文件,還可以打開文本文件,同樣,不帶b標志也可以打開文本文件。既然如此,為什麼還要區分兩種打開方式呢?因為這兩種方式在讀寫文件時的操作是不一樣的。
二進制方式很簡單,讀文件時,會原封不動地讀出文件的全部內容,寫的時候,也是把內存緩沖區的內容原封不動地寫到文件中。而文本方式就不一樣了,在寫文件時,會將換行符CRLF(0x0D 0x0A)全部轉換成單個的0x0A,並且當遇到結束符CTRLZ(0x1A)時,就認為文件已經結束。相應的,寫文件時,會將所有的0x0A換成0x0D0x0A。
所以,若使用文本方式打開二進制文件時,就很容易出現文件讀不完整,或內容不對的錯誤。即使是用文本方式打開文本文件,也要謹慎使用,比如復制文件,就不應該使用文本方式。
特別注意的是,上面這樣的說法僅適用於DOS和Windows系統。在Unix和其他一些系統中,沒有文本方式和二進制方式的區分,使不使用'b'標志都是一樣的。這是由於不同操作系統對文本文件換行符的定義,和C語言中換行符的定義有所不同而造成的。
在DOS和Windows系統中,使用CRLF(0x0D 0x0A)即\r\n雙位元組作為文本文件換行符,而Unix文本文件的換行符只有一個位元組LF(0x0A)。在C語言中,也是以LF即'\n'為換行符。由於DOS/Windows定義的換行符和C語言的不一致,C語言的標准輸入輸出函數適行讀寫文本文件時,就適行了CRLF->LF的轉換。而Unix的定義和C語言的一樣,就不必轉換。
那麼,為什麼會有定義不一致的情況呢,這純屬歷史原因。當初C是在Unix上發展的,對換行的定義自然就一樣了。其後C被引入到DOS系統,為了使原有的C程序能不加修改的讀寫DOS的文本文件,所以就在文件讀寫上做了修改。隨著DOS/Windows成為主流平台,這個當初為了兼容而做的修改給眾多的C語言開發者添了這樣一個小小的麻煩。
因此,二進制和文本模式的區別就在於對換行符和一些非可見字元的轉化。所以,從安全的角度來看,使用二進制讀取會比較安全一些。
㈣ C語言怎麼讀取二進制文件中的數據放到一個300×300的二維數組裡面
用 fopen 打開文件時 設 "rb" --用二進制方法打開,用於讀
用 fread 讀取數據,函數原型是:
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
各參數意義,請查編譯器幫助文件,這里就不開課了。
300×300 的數組需要的內存量較大,可動態分配,或用 全局量。
下面是程序例子。先建了一個2進制文件,裡面存了300*300個float型數據。然後讀這個文件里的內容。
#include<stdio.h>
float a[300][300];
int main()
{
FILE *fin, *fout;
int i,j;
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=j*100+i;
fout=fopen("a.txt","wb");
for (j=0;j<300;j++)
fwrite(&a[j][0],sizeof(float),300,fout);
fclose(fout);
for (j=0;j<300;j++) for (i=0;i<300;i++) a[j][i]=0; //數組清零
fin=fopen("a.txt","rb"); //打開輸入文件
for (j=0;j<300;j++)
fread(&a[j][0],sizeof(float),300,fin); //讀文件
fclose(fin); //關閉文件
// 下面輸出文件的左上角100個數據,和右下角100個數據供檢查參考。
for (j=0;j<10;j++) {
for (i=0;i<10;i++)printf("%3.0f ",a[j][i]); printf("\n");}
printf("\n");
for (j=290;j<300;j++){
for (i=290;i<300;i++)printf("%g ",a[j][i]); printf("\n");}
return 0;
}
㈤ 編寫C語言,實現讀取一個二進制文件,以16進制格式顯示在屏幕上
#include <stdio.h>
int main()
{
FILE *fp1 = NULL;
char buf1[100] = {0};
int i;
fp1 = fopen("1.txt", "r");
for(i=0;i<5;i++)
{
fread(&buf1[i], sizeof(char), 1, fp1);
printf("0x%x, ", buf1[i]);
}
fclose(fp1);
return 0;
}
1.txt為
C:\Documents and Settings\Administrator\桌面>t
0x62, 0x61, 0x69, 0x64, 0x75,
C:\Documents and Settings\Administrator\桌面>