当前位置: 首页 > 文档资料 > F# 中文教程 >

Basic I/O

优质
小牛编辑
129浏览
2023-12-01

基本输入输出包括 -

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

Core.Printf Module

我们使用printfprintfn函数写入控制台。 在本节中,我们将研究F#的Printf模块的细节。

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

描述
bprintf:StringBuilder→BuilderFormat →'TPrints to a StringBuilder.
eprintf:TextWriterFormat →'T将格式化输出打印到stderr。
eprintfn:TextWriterFormat →'T将格式化输出打印到stderr,添加换行符。
failwithf:StringFormat →'T打印到字符串缓冲区并使用给定结果引发异常。
fprintf:TextWriter→TextWriterFormat →'T打印到文本编写者。
fprintfn:TextWriter→TextWriterFormat →'T打印到文本编写器,添加换行符。
kbprintf :(单位→'结果)→StringBuilder→BuilderFormat →'T像bprintf一样,但调用指定的函数来生成结果。
kfprintf :(单位→'结果)→TextWriter→TextWriterFormat →'T像fprintf一样,但调用指定的函数来生成结果。
kprintf :(字符串→'结果)→StringFormat →'T像printf一样,但调用指定的函数来生成结果。 例如,这些使得打印力在所有输出都输入到通道之后进行冲洗,而不是之前。
ksprintf :(字符串→'结果)→StringFormat →'T像sprintf一样,但调用指定的函数来生成结果。
printf:TextWriterFormat →'T将格式化输出打印到stdout。
printfn:TextWriterFormat →'T将格式化输出打印到stdout,添加换行符。
sprintf:StringFormat →'T使用内部字符串缓冲区打印到字符串,并将结果作为字符串返回。

格式规范

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

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

Format占位符的语法是 -

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

type被解释为 -

类型描述
%b格式化为bool,格式为truefalse
%cFormats a character.
%s格式化一个string,格式化为其内容,而不解释任何转义字符。
%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格式打印的带符号值,以给定值和精度更紧凑为准。
%MFormats a Decimal value.
%O格式化任何值,通过装箱对象并使用其ToString方法打印。
%A, %+A格式化使用默认布局设置打印的任何值。 使用%+ A打印具有内部和私有表示的区分联合的结构。
%a

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

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

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

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

有效flags如下表所述 -

描述
0指定添加零而不是空格以构成所需的宽度。
-指定在指定宽度内左对齐结果。
+如果数字为正数,则指定添加+字符(以匹配负数的 - 符号)。
' ' (空间)如果数字为正数,则指定添加额外空格(以匹配负数的 - 符号)。
#Invalid.

例子 (Example)

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)使用指定的格式信息将指定对象和可变长度参数列表的文本表示形式(后跟当前行终止符)写入标准输出流。

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

例子 (Example)

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}", "IoWiki", "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 IoWiki 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在文件周围显示Stream,支持同步和异步读写操作。
FileSystemEventArgs提供目录事件的数据 - 已更改,已创建,已删除。
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运行时中的流与.NET for Windows Store应用程序中的托管流之间进行转换的扩展方法。

例子 (Example)

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

Note - 执行此操作所需的代码量要少得多!

open System.IO // Name spaces can be opened just as modules
File.WriteAllText("test.txt", "Hello There\n Welcome to:\n IOWIKI")
let msg = File.ReadAllText("test.txt")
printfn "%s" msg

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

Hello There
Welcome to:
IOWIKI