作者giles222449 (今夕是何夕)
看板b94902HW
標題Re: [問題]雙班計程HW8 - 關於黑色方塊的回答
時間Tue Jan 3 22:10:00 2006
※ 引述《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