跳转到内容

F# 编程/输入和输出

来自维基教科书,开放的书,开放的世界
前一页:可变集合 索引 下一页:异常处理
F# : 基本 I/O

输入和输出,也称为I/O,是指两个硬件设备之间或用户和计算机之间进行的任何类型的通信。这包括将文本打印到控制台、读写磁盘文件、通过套接字发送数据、将数据发送到打印机以及各种其他常见任务。

此页面并非旨在全面介绍 .NET 的 I/O 方法(寻求全面参考的读者鼓励查看 MSDN 上关于System.IO 命名空间的优秀文档)。此页面将简要概述 F# 程序员可用于打印和处理文件的一些基本方法。

使用控制台

[编辑 | 编辑源代码]

使用 F#

[编辑 | 编辑源代码]

到目前为止,您可能已经熟悉 Printf 模块 中的 printfprintfnsprintf 及其变体。但是,为了更正式地描述这些方法,这些方法用于使用 % 标记作为占位符的 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 格式字符串是无类型的。此外,.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 命名空间

[编辑 | 编辑源代码]

System.IO 命名空间包含许多用于执行基本 I/O 的有用类。

文件和目录

[编辑 | 编辑源代码]

以下类对于查询主机文件系统很有用

流是字节序列。.NET 提供了一些类,允许程序员使用流,包括

前一页:可变集合 索引 下一页:异常处理
华夏公益教科书