F# - 基本輸入輸出



基本輸入輸出包括:

  • 從控制檯讀取和寫入。
  • 從檔案讀取和寫入檔案。

Core.Printf 模組

我們已經使用printfprintfn函式向控制檯寫入資料。在本節中,我們將詳細瞭解F#的Printf模組。

除了上述函式外,F#的Core.Printf模組還提供了其他多種方法,可以使用%標記作為佔位符進行列印和格式化。下表顯示了這些方法及其簡要說明:

描述
bprintf : StringBuilder → BuilderFormat<'T> → 'T 列印到StringBuilder。
eprintf : TextWriterFormat<'T> → 'T 將格式化輸出列印到stderr。
eprintfn : TextWriterFormat<'T> → 'T 將格式化輸出列印到stderr,並新增換行符。
failwithf : StringFormat<'T,'Result> → 'T 列印到字串緩衝區並引發帶有指定結果的異常。
fprintf : TextWriter → TextWriterFormat<'T> → 'T 列印到文字寫入器。
fprintfn : TextWriter → TextWriterFormat<'T> → 'T 列印到文字寫入器,並新增換行符。
kbprintf : (unit → 'Result) → StringBuilder → BuilderFormat<'T,'Result> → 'T 類似於bprintf,但呼叫指定的函式來生成結果。
kfprintf : (unit → 'Result) → TextWriter → TextWriterFormat<'T,'Result> → 'T 類似於fprintf,但呼叫指定的函式來生成結果。
kprintf : (string → 'Result) → StringFormat<'T,'Result> → 'T 類似於printf,但呼叫指定的函式來生成結果。例如,這些允許列印在所有輸出都進入通道後強制重新整理,而不是之前。
ksprintf : (string → 'Result) → StringFormat<'T,'Result> → 'T 類似於sprintf,但呼叫指定的函式來生成結果。
printf : TextWriterFormat<'T> → 'T 將格式化輸出列印到stdout。
printfn : TextWriterFormat<'T> → 'T 將格式化輸出列印到stdout,並新增換行符。
sprintf : StringFormat<'T> → 'T 使用內部字串緩衝區列印到字串,並將結果作為字串返回。

格式說明符

格式說明符用於根據程式設計師的需求格式化輸入或輸出。

這些是帶有%標記的字串,指示格式佔位符。

格式佔位符的語法為:

%[flags][width][.precision][type]

型別的解釋如下:

型別 描述
%b 格式化一個bool值,格式化為truefalse
%c 格式化一個字元。
%s 格式化一個string值,格式化為其內容,不解釋任何跳脫字元。
%d, %i 格式化任何基本整數型別,格式化為十進位制整數,如果基本整數型別是有符號的,則為有符號的。
%u 格式化任何基本整數型別,格式化為無符號十進位制整數。
%x 格式化任何基本整數型別,格式化為無符號十六進位制整數,使用小寫字母a到f。
%X 格式化任何基本整數型別,格式化為無符號十六進位制整數,使用大寫字母A到F。
%o 格式化任何基本整數型別,格式化為無符號八進位制整數。
%e, %E, %f, %F, %g, %G 格式化任何基本浮點型別(float, float32),使用C風格的浮點格式說明符進行格式化。
%e, %E 格式化一個有符號值,其形式為[-]d.dddde[sign]ddd,其中d是一個十進位制數字,dddd是一個或多個十進位制數字,ddd正好是三個十進位制數字,sign是+或-。
%f 格式化一個有符號值,其形式為[-]dddd.dddd,其中dddd是一個或多個十進位制數字。小數點前的位數取決於數字的大小,小數點後的位數取決於請求的精度。
%g, %G 格式化一個有符號值,以f或e格式列印,對於給定的值和精度,哪種格式更緊湊。
%M 格式化一個Decimal值。
%O 格式化任何值,透過裝箱物件並使用其ToString方法進行列印。
%A, %+A 格式化任何值,使用預設佈局設定進行列印。使用%+A列印具有內部和私有表示的判別聯合的結構。
%a

一個通用格式說明符,需要兩個引數。第一個引數是一個函式,它接受兩個引數:第一個是給定格式化函式的適當型別的上下文引數(例如,TextWriter),第二個是要列印的值,它要麼輸出要麼返回適當的文字。

第二個引數是要列印的特定值。

%t 一個通用格式說明符,需要一個引數:一個函式,它接受給定格式化函式的適當型別的上下文引數(TextWriter),並輸出或返回適當的文字。基本整數型別為byte, sbyte, int16, uint16, int32, uint32, int64, uint64, nativeint,unativeint。基本浮點型別為floatfloat32。

寬度是一個可選引數。它是一個整數,表示結果的最小寬度。例如,%5d列印一個至少有5個字元空格的整數。

有效的標誌在下表中描述:

描述
0 指定新增零而不是空格以構成所需的寬度。
- 指定在指定的寬度內左對齊結果。
+ 指定如果數字為正,則新增+字元(以匹配負數的-號)。
' ' (空格) 指定如果數字為正,則新增一個額外的空格(以匹配負數的-號)。
# 無效。

示例

printf "Hello "
printf "World"
printfn ""
printfn "Hello "
printfn "World"
printf "Hi, I'm %s and I'm a %s" "Rohit" "Medical Student"

printfn "d: %f" 212.098f
printfn "e: %f" 504.768f

printfn "x: %g" 212.098f
printfn "y: %g" 504.768f

printfn "x: %e" 212.098f
printfn "y: %e" 504.768f
printfn "True: %b" true

編譯並執行程式後,將產生以下輸出:

Hello World
Hello
World
Hi, I'm Rohit and I'm a Medical Studentd: 212.098000
e: 504.768000
x: 212.098
y: 504.768
x: 2.120980e+002
y: 5.047680e+002
True: true

Console 類

此類是.NET框架的一部分。它表示控制檯應用程式的標準輸入、輸出和錯誤流。

它提供了從控制檯讀取和寫入的各種方法。下表顯示了這些方法:

方法 描述
Beep() 透過控制檯揚聲器播放蜂鳴聲。
Beep(Int32, Int32) 透過控制檯揚聲器播放指定頻率和持續時間的蜂鳴聲。
Clear 清除控制檯緩衝區和相應的控制檯視窗顯示資訊。
MoveBufferArea(Int32, Int32, Int32, Int32, Int32, Int32) 將螢幕緩衝區的指定源區域複製到指定的目的地區域。
MoveBufferArea(Int32, Int32, Int32, Int32, Int32, Int32, Char, ConsoleColor, ConsoleColor) 將螢幕緩衝區的指定源區域複製到指定的目的地區域。
OpenStandardError() 獲取標準錯誤流。
OpenStandardError(Int32) 獲取標準錯誤流,該流設定為指定的緩衝區大小。
OpenStandardInput() 獲取標準輸入流。
OpenStandardInput(Int32) 獲取標準輸入流,該流設定為指定的緩衝區大小。
OpenStandardOutput() 獲取標準輸出流。
OpenStandardOutput(Int32) 獲取標準輸出流,該流設定為指定的緩衝區大小。
Read 從標準輸入流讀取下一個字元。
ReadKey() 獲取使用者按下的下一個字元或功能鍵。按下的鍵將顯示在控制檯視窗中。
ReadKey(Boolean) 獲取使用者按下的下一個字元或功能鍵。按下的鍵可以選擇性地顯示在控制檯視窗中。
ReadLine 從標準輸入流讀取下一行字元。
ResetColor 將前景色和背景控制檯顏色設定為預設值。
SetBufferSize 將螢幕緩衝區區域的高度和寬度設定為指定的值。
SetCursorPosition 設定游標的位置。
SetError 將Error屬性設定為指定的TextWriter物件。
SetIn 將In屬性設定為指定的TextReader物件。
SetOut 將Out屬性設定為指定的TextWriter物件。
SetWindowPosition 設定控制檯視窗相對於螢幕緩衝區的位置。
SetWindowSize 將控制檯視窗的高度和寬度設定為指定的值。
Write(Boolean) 將指定布林值的文字表示形式寫入標準輸出流。
Write(Char) 將指定的Unicode字元值寫入標準輸出流。
Write(Char[]) 將指定的Unicode字元陣列寫入標準輸出流。
Write(Decimal) 將指定Decimal值的文字表示形式寫入標準輸出流。
Write(Double) 將指定的雙精度浮點值的文字表示形式寫入標準輸出流。
Write(Int32) 將指定的32位有符號整數值的文字表示形式寫入標準輸出流。
Write(Int64) 將指定的64位有符號整數值的文字表示形式寫入標準輸出流。
Write(Object) 將指定物件的文字表示形式寫入標準輸出流。
Write(Single) 將指定的單精度浮點值的文字表示形式寫入標準輸出流。
Write(String) 將指定的字串值寫入標準輸出流。
Write(UInt32) 將指定的32位無符號整數值的文字表示形式寫入標準輸出流。
Write(UInt64) 將指定的64位無符號整數值的文字表示形式寫入標準輸出流。
Write(String, Object) 使用指定的格式資訊將指定物件的文字表示形式寫入標準輸出流。
Write(String, Object[]) 使用指定的格式資訊將指定物件陣列的文字表示形式寫入標準輸出流。
Write(Char[], Int32, Int32) 將指定的Unicode字元子陣列寫入標準輸出流。
Write(String, Object, Object) 使用指定的格式資訊將指定物件的文字表示形式寫入標準輸出流。
Write(String, Object, Object, Object) 使用指定的格式資訊將指定物件的文字表示形式寫入標準輸出流。
Write(String, Object, Object, Object, Object) 使用指定的格式資訊將指定物件和可變長度引數列表的文字表示形式寫入標準輸出流。
WriteLine() 將當前行終止符寫入標準輸出流。
WriteLine(Boolean) 將指定布林值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Char) 將指定的 Unicode 字元及其後的當前行終止符寫入標準輸出流。
WriteLine(Char[]) 將指定的 Unicode 字元陣列及其後的當前行終止符寫入標準輸出流。
WriteLine(Decimal) 將指定 Decimal 值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Double) 將指定雙精度浮點值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Int32) 將指定 32 位有符號整值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Int64) 將指定 64 位有符號整值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Object) 將指定物件的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Single) 將指定單精度浮點值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(String) 將指定的字串值及其後的當前行終止符寫入標準輸出流。
WriteLine(UInt32) 將指定 32 位無符號整值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(UInt64) 將指定 64 位無符號整值的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(String, Object) 使用指定的格式資訊將指定物件的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(String, Object[]) 使用指定的格式資訊將指定物件陣列的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(Char[], Int32, Int32) 將指定的 Unicode 字元子陣列及其後的當前行終止符寫入標準輸出流。
WriteLine(String, Object, Object) 使用指定的格式資訊將指定物件的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(String, Object, Object, Object) 使用指定的格式資訊將指定物件的文字表示形式及其後的當前行終止符寫入標準輸出流。
WriteLine(String, Object, Object, Object, Object) 使用指定的格式資訊將指定物件和可變長度引數列表的文字表示形式及其後的當前行終止符寫入標準輸出流。

以下示例演示了從控制檯讀取資料並寫入資料:

示例

open System
let main() =
   Console.Write("What's your name? ")
   let name = Console.ReadLine()
   Console.Write("Hello, {0}\n", name)
   Console.WriteLine(System.String.Format("Big Greetings from {0} and {1}", "TutorialsPoint", "Absoulte Classes"))
   Console.WriteLine(System.String.Format("|{0:yyyy-MMM-dd}|", System.DateTime.Now))
main()

編譯並執行程式後,將產生以下輸出:

What's your name? Kabir
Hello, Kabir
Big Greetings from TutorialsPoint and Absoulte Classes
|2015-Jan-05|

System.IO 名稱空間

System.IO 名稱空間包含各種用於執行基本 I/O 的實用類。

它包含允許讀取和寫入檔案和資料流的型別或類,以及提供基本檔案和目錄支援的型別。

用於處理檔案系統的實用類:

  • System.IO.File 類用於建立、追加和刪除檔案。
  • System.IO.Directory 類用於建立、移動和刪除目錄。
  • System.IO.Path 類對錶示檔案路徑的字串執行操作。
  • System.IO.FileSystemWatcher 類允許使用者監聽目錄的更改。

用於處理流(位元組序列)的實用類:

  • System.IO.StreamReader 類用於從流中讀取字元。
  • System.IO.StreamWriter 類用於將字元寫入流。
  • System.IO.MemoryStream 類建立一個記憶體中的位元組流。

下表顯示了名稱空間中提供的所有類以及簡要說明:

描述
BinaryReader 以特定編碼讀取原始資料型別作為二進位制值。
BinaryWriter 以二進位制形式將原始型別寫入流,並支援以特定編碼寫入字串。
BufferedStream 為另一個流上的讀寫操作新增緩衝層。
Directory 公開用於建立、移動和列舉目錄和子目錄的靜態方法。
DirectoryInfo 公開用於建立、移動和列舉目錄和子目錄的例項方法。
DirectoryNotFoundException 當找不到檔案或目錄的一部分時引發的異常。
DriveInfo 提供對驅動器資訊的訪問。
DriveNotFoundException 嘗試訪問不可用的驅動器或共享時引發的異常。
EndOfStreamException 嘗試讀取流的末尾之後引發的異常。
ErrorEventArgs 為 FileSystemWatcher.Error 事件提供資料。
File 提供用於建立、複製、刪除、移動和開啟單個檔案的靜態方法,並有助於建立 FileStream 物件。
FileFormatException 當輸入檔案或應符合特定檔案格式規範的資料流格式錯誤時引發的異常。
FileInfo 提供用於建立、複製、刪除、移動和開啟檔案的屬性和例項方法,並有助於建立 FileStream 物件。
FileLoadException 找到託管程式集但無法載入時引發的異常。
FileNotFoundException 嘗試訪問磁碟上不存在的檔案失敗時引發的異常。
FileStream 公開圍繞檔案的流,支援同步和非同步讀寫操作。
FileSystemEventArgs 為目錄事件(已更改、已建立、已刪除)提供資料。
FileSystemInfo 為 FileInfo 和 DirectoryInfo 物件提供基類。
FileSystemWatcher 偵聽檔案系統更改通知,並在目錄或目錄中的檔案更改時引發事件。
InternalBufferOverflowException 內部緩衝區溢位時引發的異常。
InvalidDataException 資料流格式無效時引發的異常。
IODescriptionAttribute 設定引用事件、擴充套件程式或屬性時,視覺設計器可以顯示的描述。
IOException 發生 I/O 錯誤時引發的異常。
MemoryStream 建立一個其後備儲存為記憶體的流。
Path 對包含檔案或目錄路徑資訊的 String 例項執行操作。這些操作以跨平臺方式執行。
PathTooLongException 路徑或檔名長於系統定義的最大長度時引發的異常。
PipeException 命名管道中發生錯誤時引發。
RenamedEventArgs 為 Renamed 事件提供資料。
Stream 提供位元組序列的通用檢視。這是一個抽象類。
StreamReader 實現一個 TextReader,該讀取器以特定編碼從位元組流中讀取字元。
StreamWriter 實現一個 TextWriter,用於以特定編碼將字元寫入流。要瀏覽此型別的 .NET Framework 原始碼,請參閱參考源。
StringReader 實現一個從字串讀取的 TextReader。
StringWriter 實現一個 TextWriter,用於將資訊寫入字串。資訊儲存在底層的 StringBuilder 中。
TextReader 表示可以讀取連續字元序列的讀取器。
TextWriter 表示可以寫入連續字元序列的寫入器。此類是抽象的。
UnmanagedMemoryAccessor 提供從託管程式碼對非託管記憶體塊的隨機訪問。
UnmanagedMemoryStream 提供從託管程式碼對非託管記憶體塊的訪問。
WindowsRuntimeStorageExtensions 在開發 Windows 應用商店應用時,包含 Windows 執行時中 IStorageFile 和 IStorageFolder 介面的擴充套件方法。
WindowsRuntimeStreamExtensions 包含用於在 Windows 執行時中的流與 .NET 中的託管流之間進行轉換的擴充套件方法,用於 Windows 應用商店應用。

示例

以下示例建立一個名為 test.txt 的檔案,向其中寫入訊息,從檔案中讀取文字並將其列印到控制檯。

注意 - 完成此操作所需的程式碼量出奇地少!

open System.IO // Name spaces can be opened just as modules
File.WriteAllText("test.txt", "Hello There\n Welcome to:\n Tutorials Point")
let msg = File.ReadAllText("test.txt")
printfn "%s" msg

編譯並執行程式後,將產生以下輸出:

Hello There
Welcome to:
Tutorials Point
廣告
© . All rights reserved.