2009年10月9日 星期五

Genero技轉沒教的事(04) – base.channel內read( )與readLine( )的差別

適用版本:Genero 1.33開始都可以

被這個小差異給絆住了兩三天,特別提出來和大家分享一下。

前一篇中提到我們可以利用base.channel的library來做檔案的讀與寫,可是在閱讀線上文件時可以發現讀有read( )與readLine( )兩類function﹝同樣的寫也有write( )與writeLine( )﹞,差別是什麼?

差別就在backslash﹝反斜線﹞上。

read( )可以支援反斜線這個…特殊符號,但看樣子除了是把『\』吞掉之外,好像沒有其他的功能﹝其他功能是指\n \t之類的﹞,也就是說,當來源的source檔內含有反斜線時,用read( )讀入就會吃掉一半的反斜線量﹝原有2個剩1個,原有1個就不見;原有7個會剩3個…N mod 2的意思啦﹞。

此時用readLine( ) 解就會正常。檔案有幾個backslash就讀進來幾個。

write( ) / writeLine( ) 是寫入檔案用的,兩者的表現是一樣的:當來源是從readLine( )讀進來的含有backslash且沒有被處理過的部份,就會原樣輸出;要是程式內有再加工到backslash部份,則當做特殊符號處理。

舉例來說,原始檔為

\\\\\\\
\\\\
\\\\\\\\
\
\\
aaa\n\\bbb\nccc

經過read( )加write( )或 writeLine( )處理,都會變成

\\\
\\
\\\\

\

aaan\bbbnccc

而如果改用readLine( ),就會產出和原始檔一樣的東西。

此時若在程式內手動輸出write(“aaa\nbbb\\ccc”),則不管是write( )或writeLine( )都一樣會產出 “aaa(Enter換行) bbb\ccc” 的結果。

以上請在撰寫轉檔程式時要注意到。

補記:
這事經過幾天後,和FourJS(Genero原廠) 客服人員談起,發現這是channel default delimiter設定為『\』反斜符號導致。原先開發人員認為反斜符號用的少,所以取其作為default設定。因此若需要排除,則要先找一個檔案內未使用的ASCII字元﹝以^為例﹞,並在read前補上

CALL ch.setDelimiter("^")

即可正常讀入整行。

沒有留言:

張貼留言