F# - 基本 I/O


基本输入输出包括 -

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

核心.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 : (单位 → '结果) → TextWriter → TextWriterFormat<'T,'结果> → 'T 与 fprintf 类似,但调用指定的函数来生成结果。
kprintf : (字符串 → '结果) → StringFormat<'T,'结果> → 'T 与 printf 类似,但调用指定的函数来生成结果。例如,这些让打印在所有输出都输入到通道之后而不是之前强制刷新。
ksprintf : (字符串 → '结果) → StringFormat<'T,'结果> → 'T 与 sprintf 类似,但调用指定的函数来生成结果。
printf : TextWriterFormat<'T> → 'T 将格式化输出打印到标准输出。
printfn : TextWriterFormat<'T> → 'T 将格式化输出打印到标准输出,并添加换行符。
sprintf : StringFormat<'T> → 'T 使用内部字符串缓冲区打印到字符串并将结果作为字符串返回。

格式规格

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

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

格式占位符的语法是 -

%[flags][width][.precision][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)的适当类型的上下文参数,第二个是要打印的值,该值输出或返回适当的文本。

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

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

控制台类

此类是.NET 框架的一部分。它代表控制台应用程序的标准输入、输出和错误流。

它提供了各种读取和写入控制台的方法。下表显示了这些方法 -

方法 描述
嘟() 通过控制台扬声器播放蜂鸣声。
蜂鸣声(Int32、Int32) 通过控制台扬声器播放指定频率和持续时间的蜂鸣声。
清除 清除控制台缓冲区和相应控制台窗口的显示信息。
MoveBufferArea(Int32,Int32,Int32,Int32,Int32,Int32) 将屏幕缓冲区的指定源区域复制到指定的目标区域。
MoveBufferArea(Int32,Int32,Int32,Int32,Int32,Int32,字符,ConsoleColor,ConsoleColor) 将屏幕缓冲区的指定源区域复制到指定的目标区域。
打开标准错误() 获取标准错误流。
打开标准错误(Int32) 获取设置为指定缓冲区大小的标准错误流。
打开标准输入() 获取标准输入流。
开放标准输入(Int32) 获取标准输入流,该流设置为指定的缓冲区大小。
打开标准输出() 获取标准输出流。
开放标准输出(Int32) 获取设置为指定缓冲区大小的标准输出流。
从标准输入流读取下一个字符。
读取密钥() 获取用户按下的下一个字符或功能键。按下的键显示在控制台窗口中。
读取密钥(布尔值) 获取用户按下的下一个字符或功能键。按下的键可以选择显示在控制台窗口中。
读行 从标准输入流读取下一行字符。
重置颜色 将控制台的前景和背景颜色设置为其默认值。
设置缓冲区大小 将屏幕缓冲区的高度和宽度设置为指定值。
设置光标位置 设置光标的位置。
设置错误 将 Error 属性设置为指定的TextWriter对象。
设定 将 In 属性设置为指定的TextReader对象。
出发 将 Out 属性设置为指定的TextWriter对象。
设置窗口位置 设置控制台窗口相对于屏幕缓冲区的位置。
设置窗口大小 将控制台窗口的高度和宽度设置为指定值。
写入(布尔值) 将指定布尔值的文本表示形式写入标准输出流。
写入(字符) 将指定的 Unicode 字符值写入标准输出流。
写入(字符[]) 将指定的 Unicode 字符数组写入标准输出流。
写入(十进制) 将指定 Decimal 值的文本表示形式写入标准输出流。
写入(双) 将指定双精度浮点值的文本表示形式写入标准输出流。
写入(Int32) 将指定的 32 位带符号整数值的文本表示形式写入标准输出流。
写入(Int64) 将指定的 64 位有符号整数值的文本表示形式写入标准输出流。
写(对象) 将指定对象的文本表示形式写入标准输出流。
写(单曲) 将指定单精度浮点值的文本表示形式写入标准输出流。
写(字符串) 将指定的字符串值写入标准输出流。
写入(UInt32) 将指定的 32 位无符号整数值的文本表示形式写入标准输出流。
写入(UInt64) 将指定的 64 位无符号整数值的文本表示形式写入标准输出流。
写入(字符串,对象) 使用指定的格式信息将指定对象的文本表示形式写入标准输出流。
写入(字符串,对象[]) 使用指定的格式信息将指定对象数组的文本表示形式写入标准输出流。
写入(Char[],Int32,Int32) 将指定的 Unicode 字符子数组写入标准输出流。
写入(字符串、对象、对象) 使用指定的格式信息将指定对象的文本表示形式写入标准输出流。
写入(字符串、对象、对象、对象) 使用指定的格式信息将指定对象的文本表示形式写入标准输出流。
写入(字符串,对象,对象,对象,对象) 使用指定的格式信息将指定对象的文本表示形式和可变长度参数列表写入标准输出流。
写行() 将当前行终止符写入标准输出流。
写入行(布尔值) 将指定布尔值的文本表示形式(后跟当前行终止符)写入标准输出流。
写入行(字符) 将指定的 Unicode 字符(后跟当前行终止符)写入标准输出流。
写入行(字符[]) 将指定的 Unicode 字符数组(后跟当前行终止符)写入标准输出流。
写入行(十进制) 将指定 Decimal 值的文本表示形式(后跟当前行终止符)写入标准输出流。
写行(双) 将指定双精度浮点值的文本表示形式(后跟当前行终止符)写入标准输出流。
写入行(Int32) 将指定 32 位有符号整数值的文本表示形式(后跟当前行终止符)写入标准输出流。
写入行(Int64) 将指定 64 位有符号整数值的文本表示形式(后跟当前行终止符)写入标准输出流。
写行(对象) 将指定对象的文本表示形式(后跟当前行终止符)写入标准输出流。
写行(单行) 将指定单精度浮点值的文本表示形式(后跟当前行终止符)写入标准输出流。
写入行(字符串) 将指定的字符串值(后跟当前行终止符)写入标准输出流。
写入行(UInt32) 将指定的 32 位无符号整数值的文本表示形式(后跟当前行终止符)写入标准输出流。
写入行(UInt64) 将指定的 64 位无符号整数值的文本表示形式(后跟当前行终止符)写入标准输出流。
WriteLine(字符串,对象) 使用指定的格式信息将指定对象的文本表示形式(后跟当前行终止符)写入标准输出流。
WriteLine(字符串, 对象[]) 使用指定的格式信息将指定对象数组的文本表示形式(后跟当前行终止符)写入标准输出流。
WriteLine(Char[], Int32, Int32) 将指定的 Unicode 字符子数组(后跟当前行终止符)写入标准输出流。
WriteLine(字符串,对象,对象) 使用指定的格式信息将指定对象的文本表示形式(后跟当前行终止符)写入标准输出流。
WriteLine(字符串,对象,对象,对象) 使用指定的格式信息将指定对象的文本表示形式(后跟当前行终止符)写入标准输出流。
WriteLine(字符串,对象,对象,对象,对象) 使用指定的格式信息将指定对象和可变长度参数列表的文本表示形式(后跟当前行终止符)写入标准输出流。

以下示例演示了从控制台读取并写入其中 -

例子

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

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

班级 描述
二进制阅读器 将原始数据类型读取为特定编码中的二进制值。
二进制写入器 将二进制原始类型写入流,并支持以特定编码写入字符串。
缓冲流 添加一个缓冲层来对另一个流进行读写操作。
目录 公开用于创建、移动和枚举目录和子目录的静态方法。
目录信息 公开用于创建、移动和枚举目录和子目录的实例方法。
目录未找到异常 当无法找到文件或目录的一部分时引发的异常。
驱动器信息 提供对驱动器上信息的访问。
驱动器未发现异常 尝试访问不可用的驱动器或共享时引发的异常。
流结束异常 尝试读取超过流末尾时引发的异常。
错误事件参数 提供 FileSystemWatcher.Error 事件的数据。
文件 提供用于创建、复制、删除、移动和打开单个文件的静态方法,并帮助创建 FileStream 对象。
文件格式异常 当本应符合特定文件格式规范的输入文件或数据流格式错误时引发的异常。
文件信息 提供用于创建、复制、删除、移动和打开文件的属性和实例方法,并帮助创建 FileStream 对象。
文件加载异常 找到托管程序集但无法加载时引发的异常。
文件未找到异常 当尝试访问磁盘上不存在的文件失败时引发的异常。
文件流 围绕文件公开 Stream,支持同步和异步读写操作。
文件系统事件参数 提供目录事件的数据 - 更改、创建、删除。
文件系统信息 提供 FileInfo 和 DirectoryInfo 对象的基类。
文件系统观察者 侦听文件系统更改通知并在目录或目录中的文件发生更改时引发事件。
内部缓冲区溢出异常 内部缓冲区溢出时抛出的异常。
无效数据异常 当数据流的格式无效时引发的异常。
IO描述属性 设置视觉设计器在引用事件、扩展器或属性时可以显示的描述。
IO异常 发生 I/O 错误时引发的异常。
内存流 创建一个流,其后备存储是内存。
小路 对包含文件或目录路径信息的 String 实例执行操作。这些操作以跨平台的方式执行。
路径太长异常 当路径或文件名长于系统定义的最大长度时引发的异常。
管道异常 当命名管道内发生错误时抛出。
重命名事件参数 提供重命名事件的数据。
溪流 提供字节序列的通用视图。这是一个抽象类。
流阅读器 实现一个 TextReader,以特定编码从字节流中读取字符。
流写入器 实现 TextWriter,用于以特定编码将字符写入流。要浏览此类型的 .NET Framework 源代码,请参阅参考源。
字符串读取器 实现从字符串读取的 TextReader。
字符串编写器 实现用于将信息写入字符串的 TextWriter。该信息存储在底层 StringBuilder 中。
文本阅读器 表示可以读取一系列连续字符的阅读器。
文本编写器 代表可以编写一系列连续字符的作家。这个类是抽象的。
非托管内存访问器 提供从托管代码对非托管内存块的随机访问。
非托管内存流 提供从托管代码对非托管内存块的访问。
Windows运行时存储扩展 包含开发 Windows 应用商店应用程序时 Windows 运行时中 IStorageFile 和 IStorageFolder 接口的扩展方法。
Windows运行时流扩展 包含用于在 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