F# - 基本 I/O

基本输入输出包括 −

  • 从控制台读取和写入。
  • 读取和写入文件。

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 将格式化输出打印到标准输出。
printfn : TextWriterFormat<'T> → 'T 将格式化输出打印到标准输出,并添加换行符。
sprintf : StringFormat<'T> → 'T 使用内部字符串缓冲区打印到字符串并以字符串形式返回结果。

格式规范

格式规范用于根据程序员的需要格式化输入或输出。

这些是带有 % 标记的字符串,指示格式占位符。

格式占位符的语法是 −

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

type 被解释为 −

类型 描述
%b 格式化 bool, 格式为 truefalse
%c 格式化字符。
%s 格式化字符串,格式化为其内容,而不解释任何转义字符。
%d,%i 将任何基本整数类型格式化为十进制整数,如果基本整数类型有符号,则有符号。
%u 将任何基本整数类型格式化为无符号十进制整数。
%x 使用小写字母 a 到 f 格式化任何格式化为无符号十六进制整数的基本整数类型。
%X 使用大写字母 A 到 F 格式化任何格式化为无符号十六进制整数的基本整数类型。
%o 格式化任何基本整数类型,格式化为无符号八进制整数。
%e、%E、%f、%F、%g、%G 格式化使用 C 风格浮点格式规范格式化的任何基本浮点类型(float、float32)
%e, %E 格式化一个有符号值,其形式为[-]d.dddde[sign]ddd,其中d是单个十进制数字,dddd是一个或多个十进制数字,ddd恰好是三个十进制数字,符号是+或-。
%f 格式化具有[-]dddd.dddd 形式的有符号值,其中dddd 是一位或多位十进制数字。 小数点前的位数取决于数字的大小,小数点后的位数取决于要求的精度。
%g,%G 格式化以 f 或 e 格式打印的有符号值,以给定值和精度的更紧凑者为准。
%M 格式化十进制值。
%O 格式化任何值,通过装箱对象并使用其ToString方法来打印。
%A,%+A 格式化任何值,使用默认布局设置打印。 使用 %+A 打印具有内部和私有表示的可区分联合的结构。
%a

通用格式说明符,需要两个参数。 第一个参数是一个接受两个参数的函数:第一个是给定格式化函数(例如 TextWriter)的适当类型的上下文参数,第二个是要打印的值,该值输出或返回适当的文本。 /p>

第二个参数是要打印的特定值。

%t 通用格式说明符需要一个参数:一个函数,它接受给定格式化函数 (aTextWriter) 的适当类型的上下文参数,并且输出或返回适当的文本。 基本整数类型有 byte、sbyte、int16、uint16、int32、uint32、int64、uint64、nativeintunativeint。基本浮点类型是 floatfloat32。

width是一个可选参数。 它是一个整数,表示结果的最小宽度。 例如,%5d 打印一个至少有 5 个字符空格的整数。

有效的flags如下表所示 −

描述
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

控制台类

此类是.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 类创建内存中的字节流。

下表显示了命名空间中提供的所有类以及简要说明 −

Class 描述
BinaryReader 将原始数据类型读取为特定编码的二进制值。
BinaryWriter 将基本类型以二进制形式写入流,并支持以特定编码写入字符串。
BufferedStream 为另一个流上的读写操作添加缓冲层。
Directory 公开用于创建、移动和枚举目录和子目录的静态方法。
DirectoryInfo 公开用于创建、移动和枚举目录和子目录的实例方法。
DirectoryNotFoundException 找不到部分文件或目录时抛出的异常。
DriveInfo 提供对驱动器上信息的访问。
DriveNotFoundException 尝试访问不可用的驱动器或共享时引发的异常。
EndOfStreamException 尝试读取超过流末尾时引发的异常。
ErrorEventArgs 为 FileSystemWatcher.Error 事件提供数据。
File 提供用于创建、复制、删除、移动和打开单个文件的静态方法,并帮助创建 FileStream 对象。
FileFormatException 当本应符合某种文件格式规范的输入文件或数据流格式错误时引发的异常。
FileInfo 提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并帮助创建 FileStream 对象。
FileLoadException 找到托管程序集但无法加载时抛出的异常。
FileNotFoundException 尝试访问磁盘上不存在的文件失败时引发的异常。
FileSystemEventArgs 围绕文件公开 Stream,支持同步和异步读写操作。
FileSystemInfo 提供目录事件的数据 − 更改、创建、删除。
文件系统信息 提供 FileInfo 和 DirectoryInfo 对象的基类。
FileSystemWatcher 监听文件系统更改通知,并在目录或目录中的文件发生更改时引发事件。
InternalBufferOverflowException 内部缓冲区溢出时抛出的异常。
InvalidDataException 数据流格式无效时抛出的异常。
IODescriptionAttribute 设置视觉设计器在引用事件、扩展器或属性时可以显示的描述。
IOException 发生I/O错误时抛出的异常。
MemoryStream 创建一个流,其后备存储是内存。
Path 对包含文件或目录路径信息的 String 实例执行操作。 这些操作以跨平台的方式执行。
PathTooLongException 当路径或文件名超过系统定义的最大长度时抛出异常。
PipeException 当命名管道内发生错误时抛出。
RenamedEventArgs 提供重命名事件的数据。
Stream 提供字节序列的通用视图。 这是一个抽象类。
StreamReader 实现一个 TextReader,以特定编码从字节流中读取字符。
StreamWriter 实现 TextWriter,用于以特定编码将字符写入流。 要浏览此类型的 .NET Framework 源代码,请参阅参考源。
StringReader 实现从字符串中读取的 TextReader。
StringWriter 实现用于将信息写入字符串的 TextWriter。 该信息存储在底层 StringBuilder 中。
TextReader 表示可以读取一系列连续字符的读取器。
TextWriter 代表可以编写一系列连续字符的编写器。 这个类是抽象的。
UnmanagedMemoryAccessor 提供从托管代码对非托管内存块的随机访问。
UnmanagedMemoryStream 提供从托管代码对非托管内存块的访问。
WindowsRuntimeStorageExtensions 包含开发 Windows 应用商店应用程序时 Windows 运行时中 IStorageFile 和 IStorageFolder 接口的扩展方法。
WindowsRuntimeStreamExtensions 包含用于在 Windows 运行时中的流与 Windows 应用商店应用程序的 .NET 中的托管流之间进行转换的扩展方法。

示例

以下示例创建一个名为 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