重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
你怎么輸出的?
為昌江等地區用戶提供了全套網頁設計制作服務,及昌江網站建設行業解決方案。主營業務為做網站、成都網站制作、昌江網站設計,以傳統方式定制建設網站,并提供域名空間備案等一條龍服務,秉承以專業、用心的態度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
二進制如果以文本輸出,自然會有很多亂碼。
你可以用"%x"格式輸出看看
char
a;
a=fgetc(fp1);
printf("%c",
a);/*這樣肯定有亂碼*/
printf("%x",
a);/*這樣就是16進制*/
首先要明白一點:任何數據在內存中或者硬盤上的存儲都是1、0組成的序列,從硬盤、內存這個角度看根本不存在什么二進制和文本模式之分
區別
稍對C語言操作文件有了解都知道2點:1、首先應該fopen打開文件2、有兩類文件操作函數,對應著二進制模式和文本模式。
兩個模式的區別在兩個地方,這兩個地方的區別正好體現在剛才說的2點上。
1、
打開文件時選擇模式
使用fopen函數時,要給予第二個參數一個值,告訴fopen使用什么模式打開文件。這里的參數決定的就是第一個區別:對于字符串中的\n如何處理?
教材中說,文本模式中,在存儲\n時要轉化為\r\n,讀取文件時進行逆轉換。二進制模式時,則不進行轉換。這是在操作系統是Windows的條件下。
首先我們要知道回車和換行是不相同的,Windows中文字另起一行內存表示為回車換行對應\r\n,而Linux、Unix中則是單單一個換行對應\n。Mac中則是一個回車對應\r
C語言起源于Unix的產生,對于文件中的另起一行,Unix采用單個\n表示。所以我們通常在輸出一個短話想換行時加一個\n就可以了,Windows也是如此。到了數據從內存到硬盤上進行存儲時,對于unix來說,\n照樣是\n。而Windows為了防止讀取時混亂必須轉換為\r\n。Mac呢,就是\r。
這就是第一區別,這個區別是體現在fopen第二個參數,跟你使用文本模式的函數還是二進制模式的函數根本不相關!你可以做一個實驗,使用二進制模式的函對于同樣的字符串:”Hello\n”,當fopen使用w參數寫入文件,無論是fwrite還是fprintf都會對\n會進行轉換,而使用wb參數則都不進行轉換。
2、
兩種不同模式的函數
打開文件后,要進行數據寫入。
教材中說,使用文本模式打開文件,就要用fprintf寫入數據,使用二進制模式打開文件,就要用fwrite寫入數據。
其實你用文本模式打開文件,一個字符串,fprintf、fwrite都能寫入文件,寫入還都是一樣的數據。使用兩類函數的區別其實在于數字的處理上。
對于一個數字5,你用fprintf寫入,將把數字5轉換為字符5,將其對應的ASCII編碼存入存儲器,占用1個字節。但實際上數字5就是數字5,對應2進制101,整形占用4個字節。fwrite則將這個數字在內存中占用的4個字節全部原樣寫入到硬盤中,占4個字節。
而同樣對于一段字符串”Hello”,使用ASCII編碼對于fprintf和fwrite都能原樣寫到硬盤中。
同樣對于這個區別,你仍然能做個實驗,對于一個int型數字5,你如何用fprintf和fwrite寫入到硬盤中,他們對應的十六進制碼是多少?對于一段字符串你再用兩個函數分別寫到硬盤中,你看看對應的十六進制碼是什么。這個實驗跟你用fopen如何指定第二個參數無關。
當然不對了,你的結構體成員,是一個指針
sizeof(student) ,win32是4字節,win64是8字節
當讀入其中4個或8個字節時,它指向的指針地址并不一定存在
你可以定義為一個字符數組