① c語言中指針讀寫文件,問什麼記事本都是亂碼,怎麼改呢
從代碼看,在Windows平台是有大概率會亂碼,假如你的商品信息數組里存放了換行就一定會亂碼。
主要問題在文件的打開方式不對,fread, fwrite函數最好以二進制模式打開文件,即打開方式加上b,即(rb, wb)。在unix/Linux系統應該沒問題。以下是問題解釋:
二進制和文本模式的區別
1.在windows系統中,文本模式下,文件以""代表換行。若以文本模式打開文件,並用fputs等函數寫入換行符" "時,函數會自動在" "前面加上" "。即實際寫入文件的是"" 。
2.在類Unix/Linux系統中文本模式下,文件以" "代表換行。所以Linux系統中在文本模式和二進制模式下並無區別。
(1)c語言讀取開頭亂碼擴展閱讀:
ffopen為C語言編程中所需的一個常用語言,多數用來打開文件。其調用的一般形式為:文件指針名=fopen(文件名,使用文件方式);其中,『』文件指針名」必須是被說明為FILE 類型的指針變數,文件名」是被打開文件的文件名;「使用文件方式」是指文件的類型和操作要求。「文件名」是字元串常量或字元串數組。
基本介紹函數功能:打開一個文件函數原型:FILE * fopen(const char * path,const char * mode);相關函數:open,fclose,fopen_s,_wfopenfopen所需庫:返回值:文件順利打開後,指向該流的文件指針就會被返回。如果文件打開失敗則返回NULL,並把錯誤代碼存在errno 中。一般而言,打開文件後會做一些文件讀取或寫入的動作,若打開文件失敗,接下來的讀寫動作也無法順利進行,所以一般在fopen()後作錯誤判斷及處理。
參數說明:參數path字元串包含欲打開的文件路徑及文件名,參數mode字元串則代表著流形態。
mode有下列幾種形態字元串:
r 以只讀方式打開文件,該文件必須存在。
r+ 以可讀寫方式打開文件,該文件必須存在。
rb+ 讀寫打開一個二進制文件,允許讀寫數據。
rw+ 讀寫打開一個文本文件,允許讀和寫。
w 打開只寫文件,若文件存在則文件長度清為0,即該文件內容會消失。若文件不存在則建立該文件。
w+ 打開可讀寫文件,若文件存在則文件長度清為零,即該文件內容會消失。若文件不存在則建立該文件。
a 以附加的方式打開只寫文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾,即文件原先的內容會被保留。(EOF符保留)
a+ 以附加方式打開可讀寫的文件。若文件不存在,則會建立該文件,如果文件存在,寫入的數據會被加到文件尾後,即文件原先的內容會被保留。 (原來的EOF符不保留)
wb 只寫打開或新建一個二進制文件;只允許寫數據。
wb+ 讀寫打開或建立一個二進制文件,允許讀和寫。ab+ 讀寫打開一個二進制文件,允許讀或在文件末追加數據。
② C語言讀取文件出現錯誤,讀取了兩遍而且有亂碼是什麼情況
程序執行兩邊,肯定是代碼問題。
數據對計算機而言就是2進制,你看亂碼說明顯示的時候沒有對應字元集,你把原文件打開看有亂碼沒。
或者你文件有中文,你試試用全部英文和數字的文件讀取。
另外,文件有格式的話,你換fscanf和fprintf看看。
③ c語言讀取文件數據亂碼
把打開方式改為
"r"以及把讀取信息用fscanf吧,因為如果你是原先先把kk.txt寫好,然後再用你的程序打開它的話,由於裡面有換行符以及空格等內容,除非開始你是用fwrite函數寫入的結構信息,否則fread會把這些都作為信息讀取的(也就是說它讀到一個struct
Student_type大小的數據就結束,而不管這裡面到底存放的是什麼,這個過程中讀到的可能不是一個完整的結構的數據),所以就會出現你所說的亂碼。