c語言讀寫以二進制
『壹』 怎樣用c語言讀取txt文件中的二進制數據並轉為一維數組
使用read()函數以下為網路的介紹
函數名:read
功 能:從文件中讀
函數原型 :int read(int handle, void *buf, int nbyte);
表頭文件:#include <unistd.h>
函數說明:read()會把參數handle所指的文件傳送nbyte個位元組到buf指針所指的內存中。若參數nbyte為0,則read()不會有作用並返回0。返回值為實際讀取到的位元組數,如果返回0,表示已到達文件尾或無可讀取的數據。
程序例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <io.h>
#include <alloc.h>
#include <fcntl.h>
#include <process.h>
#include <sys\stat.h>
int main(void)
{
    void *buf;
    int handle, bytes;
    buf = malloc(10);
/*
Looks for a file in the current directory named TEST.$$$ and attempts
to read 10 bytes from it.  To use this example you should create the
file TEST.$$$
*/
    if ((handle =
    open("TEST.$$$", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD)) == -1)
    {
        printf("Error Opening File\n");
        exit(1);
    }
    if ((bytes = read(handle, buf, 10)) == -1) {
    printf("Read Failed.\n");
    exit(1);
    }
    else {
        printf("Read: %d bytes read.\n", bytes);
    }
    return 0;
}
2Linux C
編輯
定義函數
ssize_t read(int fd, void *buf, size_t count);
返回值
成功返回讀取的位元組數,出錯返回-1並設置errno,如果在調read之前已到達文件末尾,則這次read返回0。
參數
參數count是請求讀取的位元組數,讀上來的數據保存在緩沖區buf中,同時文件的當前讀寫位置向後移。注意這個讀寫位置和使用C標准I/O庫時的讀寫位置有可能不同,這個讀寫位置是記在內核中的,而使用C標准I/O庫時的讀寫位置是用戶空間I/O緩沖區中的位置。比如用fgetc讀一個位元組,fgetc有可能從內核中預讀1024個位元組到I/O緩沖區中,再返回第一個位元組,這時該文件在內核中記錄的讀寫位置是1024,而在FILE結構體中記錄的讀寫位置是1。注意返回值類型是ssize_t,表示有符號的size_t,這樣既可以返回正的位元組數、0(表示到達文件末尾)也可以返回負值-1(表示出錯)。
read函數返回時,返回值說明了buf中前多少個位元組是剛讀上來的。有些情況下,實際讀到的位元組數(返回值)會小於請求讀的位元組數count,例如:讀常規文件時,在讀到count個位元組之前已到達文件末尾。例如,距文件末尾還有30個位元組而請求讀100個位元組,則read返回30,下次read將返回0。
『貳』 C語言文件 "w+"與"wb+"區別
w+以純文本方式讀寫,而wb+是以二進制方式進行讀寫。
mode說明:
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失若不存在則建立該文件。
wb 只寫方式打開或新建一個二進制文件,只允許寫數據。
wb+ 讀寫方式打開或建立一個二進制文件,允許讀和寫。
計算機的存儲在物理上是二進制的,所以文本文件與二進制文件的區別不在於物理存儲上,而是邏輯上的不同。即編碼格式的不同,文本文件用的是字元編碼,例如ASCII編碼(定長),二進制文件是基於值編碼,用的是二進制的方式來存放數據的(變長)。

(2)c語言讀寫以二進制擴展閱讀
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留
ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
『叄』 c語言中rb+什麼意思
在C語言中,rb+的含義如下:
rb+表示以讀寫模式打開一個二進制文件,且該文件必須存在。
- 讀寫模式:這意味著你可以對文件進行讀取操作,也可以進行寫入操作。與只讀模式或只寫模式不同,rb+模式允許你同時執行這兩種操作。
 - 二進制文件:這表明文件是以二進制形式打開的,而不是文本形式。二進制文件通常用於存儲非文本數據,如圖像、音頻文件或程序的可執行代碼。在處理二進制文件時,數據以位元組為單位進行讀寫,而不是按字元處理。
 - 文件必須存在:使用rb+模式打開文件時,如果指定的文件不存在,操作將失敗。這與wb+模式不同,後者在文件不存在時會創建一個新文件。
 
簡而言之,rb+模式在C語言中用於打開現有的二進制文件,以便進行讀寫操作。
『肆』 如何用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語言文件中,「rb」和「r」有什麼區別
一、作用不同
1、rb:代表二進制文件,用來讀寫二進制文件。
2、r:代表文本文件,用來讀寫文本文件。
二、特點不同
1、rb:文件編碼是變長的,靈活利用率要高,而解碼要難一些,不同的二進制文件解碼方式是不同的。
2、r:是一種典型的順序文件,其文件的邏輯結構又屬於流式文件。

三、優劣不同
1、rb:二進制文件比較節約空間,這兩者儲存字元型數據時並沒有差別。但是在儲存數字,特別是實型數字時,二進制更節省空間。
2、r:文本文件存在於計算機系統中,通常在文本文件最後一行放置文件結束標志。文本文件的編碼基於字元定長,解碼相對要容易一些。
