Skip to content

3. IO 部分

Larry76 edited this page Mar 19, 2023 · 3 revisions

概述

为了更好的管理 IO 调用,NaDGenLib 基于 C++ 的 IO 库实现了一套自己的 IO 逻辑。

对于 NaDGenLib 来说,任何的数据生成器的首要任务是将 IO 移交给 NaDGenLib 本身,即文件重定向功能。

下面将讲解 NaDGenLib 关于 IO 部分的内容

基本逻辑和原则

NaDGenLib 关于 IO 的基本逻辑如下:

  1. 在程序入口处使用文件重定向相关函数。
  2. 在每个用户的自定义函数中使用 IO 流刷新。
  3. 在其他情况,用户使用 cout 作为自己的输出方式,输入方式任意。

NaDGenLib 关于 IO 的基本原则如下:

  1. 对于程序的入口(即 main 函数),应当首先使用文件重定向功能将 IO 重定向到指定文件。
  2. 在将 IO 重定向到指定文件之后,您就不应该使用任何非 NaDGenLib 所支持的 IO,因为这可能会导致无法预料的错误发生。
  3. 对于 NaDGenLib 来说,IO 的更新仅限于当前函数内,即在入口处重定向一次,在其他函数的开头处刷新 IO。
  4. NaDGenLib 保证任何时候所更新的 IO 是有效的,NaDGenLib 不保证若在程序运行过程中对同一文件进行二次重定向时,文件原本的内容是否被保留。

文件重定向

RedirectToFile 函数

将当前 IO 重定向到指定文件上,并刷新当前函数内的 IO 流。

语法

void RedirectToFile(
    [in]    string  filename
);

参数

[in] filename

类型:string

要重定向到的文件名,若该值为 con,则重定向到控制台。

错误处理

若重定向过程中发生错误,则会出发断言失败并终止程序。

断言失败时,程序将会以 Segmentation fault 的方式终止程序,详细终止信息请看断言输出。

警告

注意,当使用该函数后,请使用 cout 作为您的输出。

注意,除非使用函数 AutoGenerate,否则在任何情况下,请务必在入口处先调用该函数。

注意,使用该头文件时,请不要使用 freopen 等重定向方式,这可能会导致原先的文件重定向失效。

AutoGenerate 函数

依照用户规则自动进行文件重定向,并执行用户自定义的生成方案函数。

语法

void AutoGenerate(
    [in]            string format, 
    [in]            int startLabel, 
    [in]            int endLabel,
    [in]            void (*custom)(),
    [in, optional]  bool enableStd
)

其还有一个重载:

void AutoGenerate(
    [in]            string format, 
    [in]            int startLabel, 
    [in]            int endLabel,
    [in]            void (*custom)(int),
    [in, optional]  bool enableStd
)

参数

[in] format

类型:string

要重定向的文件名格式,应当包含且只包含一个 %d

[in] startLabel

类型:int

文件名起始编号。

[in] endLabel

类型:int

文件名终止编号。

[in] custom

类型:void (*)()void (*)(int)

用户自定义的生成方案函数。

[in, optional] enableStd

类型:bool

决定是否启用标算程序来生成答案,默认不启用(false)。

错误处理

若重定向过程中发生错误,则会出发断言失败并终止程序。

断言失败时,程序将会以 Segmentation fault 的方式终止程序,详细终止信息请看断言输出。

警告

注意,当打开 “启用标算” 开关时,您应当保证您的标算程序已经被注册,具体注册方式请见 RegisterStdProgram

注意,文件名的格式应当包含且只包含一个 %d

注意,文件名不会自动补全后缀

注意,答案文件文件名会有强制后缀.ans

注释

关于自定义的生成方案函数,您应该依照以下两种方式来定义:

第一种:

void YourFunctionName() { }

第二种:

void YourFunctionName(int YourParamName) { }

当您使用第二种定义方式时,AutoGenerate 将会把当前正在生成数据的编号传递给您自定义的生成方案函数。

FlushIOStream 函数

用于刷新当前函数内的 IO 重定向。

语法

void FlushIOStream()

参数

警告

注意,滥用此函数可能会导致编译错误。