F# 编程/输入和输出
F# : 基本 I/O |
输入和输出,也称为I/O,是指两个硬件设备之间或用户和计算机之间进行的任何类型的通信。这包括将文本打印到控制台、读写磁盘文件、通过套接字发送数据、将数据发送到打印机以及各种其他常见任务。
此页面并非旨在全面介绍 .NET 的 I/O 方法(寻求全面参考的读者鼓励查看 MSDN 上关于System.IO 命名空间的优秀文档)。此页面将简要概述 F# 程序员可用于打印和处理文件的一些基本方法。
到目前为止,您可能已经熟悉 Printf 模块 中的 printf
、printfn
、sprintf
及其变体。但是,为了更正式地描述这些方法,这些方法用于使用 %
标记作为占位符的 printf 风格的打印和格式化
Print 方法接受一个格式字符串和一系列参数,例如
> sprintf "Hi, I'm %s and I'm a %s" "Juliet" "Scorpio";;
val it : string = "Hi, I'm Juliet and I'm a Scorpio"
Printf
模块中的方法是类型安全的。例如,尝试使用 int
占位符替换字符串会导致编译错误
> sprintf "I'm %i years old" "kitty";;
sprintf "I'm %i years old" "kitty";;
---------------------------^^^^^^^^
stdin(17,28): error FS0001: The type 'string' is not compatible with any of the types
byte,int16,int32,int64,sbyte,uint16,uint32,uint64,nativeint,unativeint, arising from
the use of a printf-style format string.
根据 F# 文档,%
占位符由以下部分组成
%[flags][width][.precision][type]
[flags](可选)
有效标志为
- 0:添加零而不是空格以达到所需的宽度
- '-': 将结果在指定的宽度内左对齐
- '+': 如果数字为正,则添加 '+' 字符(以匹配负数的 '-' 符号)
- ' ': 如果数字为正,则添加一个额外的空格(以匹配负数的 '-' 符号)
[width](可选)
可选宽度是一个整数,表示结果的最小宽度。例如,%6d 打印一个整数,在它前面加空格以至少填充 6 个字符。如果宽度为 '*',则将使用一个额外的整数参数来指定相应的宽度。
- 任何数字
- '*':
[.precision](可选)
表示浮点数后的位数。
> sprintf "%.2f" 12345.67890;;
val it : string = "12345.68"
> sprintf "%.7f" 12345.67890;;
val it : string = "12345.6789000"
[type](必需)
以下占位符类型将被解释为以下内容
%b: bool, formatted as "true" or "false" %s: string, formatted as its unescaped contents %d, %i: any basic integer type formatted as a decimal integer, signed if the basic integer type is signed. %u: any basic integer type formatted as an unsigned decimal integer %x, %X, %o: any basic integer type formatted as an unsigned hexadecimal (a-f)/Hexadecimal (A-F)/Octal integer %e, %E, %f, %F, %g, %G: any basic floating point type (float,float32) formatted using a C-style floating point format specifications, i.e %e, %E: Signed value having the form [-]d.dddde[sign]ddd where d is a single decimal digit, dddd is one or more decimal digits, ddd is exactly three decimal digits, and sign is + or - %f: Signed value having the form [-]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision. %g, %G: Signed value printed in f or e format, whichever is more compact for the given value and precision. %M: System.Decimal value %O: Any value, printed by boxing the object and using it's ToString method(s) %A: Any value, printed by using Microsoft.FSharp.Text.StructuredFormat.Display.any_to_string with the default layout settings %a: A general format specifier, requires two arguments: (1) a function which accepts two arguments: (a) a context parameter of the appropriate type for the given formatting function (e.g. an #System.IO.TextWriter) (b) a value to print and which either outputs or returns appropriate text. (2) the particular value to print %t: A general format specifier, requires one argument: (1) a function which accepts a context parameter of the appropriate type for the given formatting function (e.g. an #System.IO.TextWriter)and which either outputs or returns appropriate text. Basic integer types are: byte,sbyte,int16,uint16,int32,uint32,int64,uint64,nativeint,unativeint Basic floating point types are: float, float32
程序员可以使用 printf
方法打印到控制台,但 F# 建议使用 System.Console.ReadLine()
方法读取控制台输入。
.NET 包含它自己的格式说明符表示法。.NET 格式字符串是无类型的。此外,.NET 的格式字符串旨在可扩展,这意味着程序员可以实现自己的自定义格式字符串。格式占位符具有以下形式
{index[, length][:formatString]}
例如,在 fsi 中使用 String.Format
方法
> System.String.Format("Hi, my name is {0} and I'm a {1}", "Juliet", "Scorpio");;
val it : string = "Hi, my name is Juliet and I'm a Scorpio"
> System.String.Format("|{0,-50}|", "Left justified");;
val it : string = "|Left justified |"
> System.String.Format("|{0,50}|", "Right justified");;
val it : string = "| Right justified|"
> System.String.Format("|{0:yyyy-MMM-dd}|", System.DateTime.Now);;
val it : string = "|2009-Apr-06|"
有关 .NET 格式说明符的全面参考,请参阅数字格式字符串、日期和时间格式字符串以及枚举格式字符串。
程序员可以使用 System.Console 类 读取和写入控制台
open System
let main() =
Console.Write("What's your name? ")
let name = Console.ReadLine()
Console.Write("Hello, {0}", name)
main()
System.IO 命名空间包含许多用于执行基本 I/O 的有用类。
以下类对于查询主机文件系统很有用
- System.IO.File 类公开了几个用于创建、追加和删除文件的有用成员。
- System.IO.Directory 公开了用于创建、移动和删除目录的方法。
- System.IO.Path 对表示文件路径的字符串执行操作。
- System.IO.FileSystemWatcher 允许用户监听目录以获取更改。
流是字节序列。.NET 提供了一些类,允许程序员使用流,包括
- System.IO.StreamReader 用于从流中读取字符。
- System.IO.StreamWriter 用于将字符写入流。
- System.IO.MemoryStream 创建内存中的字节流。