看板 b94902HW 關於我們 聯絡資訊
※ 引述《rangerx (^^")》之銘言: : 她的answer.dat 裡的東西用notepad打開怎麼都是黑色長方形方塊啊 : 要怎麼處理呢? 先來看看一個範例 這裡有一個程式分別印出'\n' '\r' '\n''\r' 結果如下 ================================================================ '\n'=■(here)'\r'=■(here)'\r''\n'= (here) ================================================================ ↑這是用記事本開啟的結果 ================================================================ '\n'=(here)'\r'= (here)'\r''\n'= (here) ================================================================ ↑這是貼在bbs上的結果 但是..如果再把這個檔案讀回來...fopen(xxx,"r") 然後輸出到螢幕上...會怎樣呢? ================================================================ '\n'= (here)'\r'= (here)'\r''\n'= (here) ================================================================ ↑這是在螢幕上看到的結果 為什麼會這樣 ? 原因是因為檔案的 "二元(binary)" 和 "文字(text)" 觀點不同所致 簡單的說...如果以 "文字觀點" 開啟一份檔案時 所使用的程式會依作業環境將檔案的二元資料作適當的轉換 (例如在Windows系統)程式會將8個位元視為一個位元組... 用來表示一個字元(所以字元的二元值是從0 ~ 255) 比如說65就是眾所皆知的A 若純文字編輯程式從檔案裡面讀取到65...就顯示A 以此類推 現在來說換行符號來說好了 在寫c程式的時候以'\n'(二元值為10)來表示換行 然而Windows的文件檔是以'\r''\n'(二元值為13 10)來表示換行 麥金塔的文件檔是以'\r'(二元值為13)來表示換行 當在這些系統下以文字觀點開啟這些檔案時 都會看到換行的動作 但是如果以二元觀點來開啟檔案 程式不會對檔案進行對應的動作 因此Windows的換行會被表示成'\r''\n' 麥金塔的換行會被表示成'\r' 今天...以記事本來開啟網頁上的std.dat和answer.dat (助教應該是在Unix-like的作業系統下寫的...) (Unix的換行符號是'\r') 當以Windows的記事本程式開啟這個檔案時 程式僅讀取到13 因此程式不將'\r'轉換為換行符號 (當記事本讀取到不能對應的二元值時...通常會有四種處理方式) (第一種是輸出空格...第二種是輸出方塊... 第三種是輸出問號...第四種是不輸出任何東西) 所以如果用記事本開啟std.dat和answer.dat 在應該看到換行的地方就會看到"■" 而要如何解決 ? 其實很簡單...只要用c的文字觀點開起檔案即可 當檔案中有'\r' '\n' '\r''\n'時 c的文字觀點會一律視為換行符號 所以你開啟檔案時用fopen(xxx,"r")開啟檔案即可 (若要以二元觀點開啟檔案則使用fopen(xxx,"rb")) 如果想要用記事本看到正常的樣子 這個程式會有幫助 ================================================================ #include <stdio.h> void main(void) { char ch; FILE * std,* answer,* std_corrected,* answer_corrected; std=fopen("std.dat","r"); std_corrected=fopen("std_corrected.dat","w"); while((ch=getc(std))!=EOF)putc(ch,std_corrected); fclose(std); fclose(std_corrected); answer=fopen("answer.dat","r"); answer_corrected=fopen("answer_corrected.dat","w"); while((ch=getc(answer))!=EOF)putc(ch,answer_corrected); fclose(answer); fclose(answer); } ================================================================ 編譯此程式並執行後 (記得把std.dat和answer.dat和產生的執行檔放在同一個資料夾下) 會產生std_corrected.dat和answer_corrected.dat這兩個檔案 用記事本可正常閱覽 此程式的原理是以c的文字觀點開啟原本的std.dat和answer.dat檔案 然後再以文字觀點儲存成std_corrected.dat和answer_corrected.dat 在Windows系統的實作下換行符號會被儲存成'\r''\n' 因此用記事本就可以正常顯示囉 ~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.247.107 ※ 編輯: giles222449 來自: 140.112.247.107 (01/03 22:13)
alex1025:真熱心~小聲說其實wordpad,UltraEdit都可以開XD 01/03 22:47
giles222449:是滴 ~ 還有IE也是可以開滴 ~ 01/03 23:42