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.