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()