[ Skill ] 文件讀寫 & IO 句柄


https://www.cnblogs.com/yeungchie/

在 Skill 中使用一種叫做 ioport 類型的變量來操作文件。不過我一般更習慣稱為 IO 句柄 (IO/File Handle)

常用下面兩個函數來獲得這些 IO 句柄:

  • infile
    獲得輸入句柄, 文件。
  • outfile
    獲得輸出句柄, 文件。

輸入

輸入句柄 infile

假設現有一個文件 file.txt

$ cat -n file.txt
     1  2022-02-20
     2  20:39:29
     3  Sunday

獲取一個輸入句柄,打開這個文件。

inHandle = infile( "file.txt" )

行讀取 gets

gets 可以將按 迭代文件內容(一行一行讀取),全部內容讀取完會返回 nil

gets( string inHandle )

上面這個操作將第一行的內容賦值給了 string 變量。

printf( "%s\n" string )
; 2022-02-20

也可以將第一個參數指定為 nil,不賦值給變量,通過函數返回值的讀取內容,類似 sprintf 函數
再次使用 gets 則會繼續讀取第二行內容。

printf( "%s\n" gets( nil inHandle ))
; 20:39:29

字讀取 getc

getc 可以將按 單個字符 迭代文件內容(一個字一個字讀取),全部內容讀取完會返回 nil
gets 有點不同,getc 返回 symbol 類型,且第一個變量為句柄。

printf( "%s\n" getc( inHandle ))
; S

讀取完剩下內容,並打印出來。

while( char = getc( inHandle )
  printf( "%s\n" char )
)
; u
; n
; d
; a
; y

讀取結束后記得關閉這個句柄。

close( inHandle )

輸出

輸出句柄 outfile

獲取一個輸出句柄,打開一個文件,打開方式如果沒有指定則默認為 w,這會覆蓋原有內容。

outHandle = outfile( "file.txt" )

打印輸出 fprintf

fprintf 將字符串輸出到 IO 句柄,下面寫點東西進去。

fprintf( outHandle "%s\n" "2022-02-20")
close( outHandle )
$ cat -n file.txt
     1  2022-02-20

打開方式 mode

上面提到 outfile 的默認打開方式 w 會覆蓋源文件內容,當我們需要在源文件基礎上追加內容時,可以在第二個參數指定 a ,代表 append 方式。

outHandle = outfile( "file.txt" "a" )
fprintf( outHandle "%s\n" "21:06:13")
close( outHandle )
$ cat -n file.txt
     1  2022-02-20
     2  21:06:13

關閉

關閉句柄 close

上面的例子中已經出現過了,功能很簡單,IO 句柄用完后關掉它,解除與文件的關聯,釋放資源(文件句柄資源是有限的)。

close( inHandle )
close( outHandle )

預設句柄

預設的幾個句柄變量。

標准輸入

  • piport

標准輸入句柄,類似於 C 中的 stdin。

可以配合函數 get_filename 來獲取當前文件的文件名(路徑):

$ cat -n piport.il
     1  printf( "The value is %s\n" get_filename( piport ))
load( "piport.il" )
The value is piport.il
  • stdin

這個變量在 help 文檔中描述是和 piport 類似的,但兩者又不相等。

stdin == piport
; nil

也無法配合 get_filename 函數:

$ cat -n stdin.il
     1  printf( "The value is %s\n" get_filename( stdin ))
load( "stdin.il" )
The value is *stdin*

也不像 Perl 中的 <STDIN> 能獲取終端上的用戶輸入,我暫時沒找到應用場景。

標准輸出

  • poport

標准輸出句柄,類似於 C 中的 stdout。

在使用一些 常用的 print 函數 向 CIW 打印數據時,其實省略了指向標准輸出這一步,例如 printf

printf( "%s\n" getCurrentTime())
; Feb 21 21:19:42 2022

也可以寫成 fprintf

fprintf( poport "%s\n" getCurrentTime())
; Feb 21 21:20:47 2022

效果是一樣的。

  • ptport

跟 poport 一樣的。

ptport == poport
; t
  • stdout

跟 poport 一樣的。

stdout == poport
; t

錯誤輸出

  • errport

錯誤輸出句柄,類似於 C 中的 stderr,用於打印錯誤信息,在 CIW 上會顯示紅色的字體。

fprintf( poport "Normal information ~\n" )

Normal information ~

fprintf( errport "Error information !\n" )

Error information !

  • stderr

跟 errport 一樣的。

stderr == errport
; t

警告輸出

  • woport

警告輸出句柄,也類似於 C 中的 stdout,用於打印警告信息,在 CIW 上會顯示黃色的字體。

fprintf( woport "Warning information !\n" )

Warning information !

刷新緩沖區

刷新輸出緩沖區

drain( poport )

更多時候是想刷新 CIW 中的輸出信息,所以我一般用這個

hiFlushCIW()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM