F# - 基本I/O

F# - 基本I/O 首页 / F#入门教程 / F# - 基本I/O

基本输入输出包括-

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

Core.Printf模块

无涯教程已经使用 printf printfn 函数来写入控制台,在本节中,将研究F#的 Printf 模块的详细信息。

除上述功能外,F#的 Core.Printf 模块还有多种其他使用%标签作为占位符进行打印和格式化的方法,下表显示了具有简要说明的方法-

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

格式化

格式规范用于根据程序员的需要来格式化输入或输出,这些是带有%标签的字符串,指示格式占位符。

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

类型解释为-

类型说明
%b格式化布尔型,格式为 true 或 false 。
%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

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

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

%t通用格式说明符需要一个参数:一个函数,该函数接受给定格式函数(aTextWriter)的适当类型的context参数,并输出或返回适当的文本。基本的整数类型是 byte,sbyte,int16,uint16,int32,uint32,int64,uint64,nativeint,和 unativeint。基本的浮点类型是 float

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

下表描述了有效的 flags -

说明
0指定添加零而不是空格来组成所需的宽度。
-指定在指定的宽度内将输出左对齐。
+指定在数字为正数时添加一个+字符(以匹配负号的-号)。
''(空格)指定在数字为正数时添加一个额外的空格(以匹配负号的-号)。
#无效。
printf "Hello "
printf "Learnfk"
printfn ""
printfn "Hello "
printfn "Learnfk"
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 Learnfk
Hello
Learnfk
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将foreground color和background color设置为默认值。
SetBufferSize将屏幕缓冲区的高度和宽度设置为指定值。
SetCursorPosition设置光标的位置。
SetError将Error属性设置为指定的 TextWriter 对象。
SetIn将In属性设置为指定的 TextReader 对象。
SetOut将Out属性设置为指定的 TextWriter 对象。
SetWindowPosition设置控制台窗口相对于屏幕缓冲区的位置。
SetWindowSize将控制台窗口的高度和宽度设置为指定的值。
Write(Boolean)将指定布尔值的文本表示形式写入标准输出流。
Write(char)将指定的Unicode字符值写入标准输出流。
Write(Char [])将指定的Unicode字符数组写入标准输出流。
Write(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}", "LearnFk", "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 LearnFk and Absoulte Classes
|2015-Jan-05|

命名空间

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

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

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

以下示例创建一个名为test.txt的文件,在该文件中写入一条消息,从该文件中读取文本并将其打印在控制台上。

链接:https://www.learnfk.comhttps://www.learnfk.com/fsharp/fsharp-basic-io.html

来源:LearnFk无涯教程网

注意-做到这一点所需的代码量少得多!

open System.IO //命名空间可以像模块一样打开
File.WriteAllText("test.txt", "Hello There\n Welcome to:\n Learnfk Point")
let msg = File.ReadAllText("test.txt")
printfn "%s" msg

编译并执行程序时,将产生以下输出-

Hello There
Welcome to:
Learnfk Point

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

左耳听风 -〔陈皓〕

赵成的运维体系管理课 -〔赵成〕

Java并发编程实战 -〔王宝令〕

Linux实战技能100讲 -〔尹会生〕

即时消息技术剖析与实战 -〔袁武林〕

eBPF核心技术与实战 -〔倪朋飞〕

李智慧 · 高并发架构实战课 -〔李智慧〕

Go进阶 · 分布式爬虫实战 -〔郑建勋〕

大型Android系统重构实战 -〔黄俊彬〕

好记忆不如烂笔头。留下您的足迹吧 :)