-
Notifications
You must be signed in to change notification settings - Fork 1
3. IO 部分
为了更好的管理 IO 调用,NaDGenLib 基于 C++ 的 IO 库实现了一套自己的 IO 逻辑。
对于 NaDGenLib 来说,任何的数据生成器的首要任务是将 IO 移交给 NaDGenLib 本身,即文件重定向功能。
下面将讲解 NaDGenLib 关于 IO 部分的内容
NaDGenLib 关于 IO 的基本逻辑如下:
- 在程序入口处使用文件重定向相关函数。
- 在每个用户的自定义函数中使用 IO 流刷新。
- 在其他情况,用户使用
cout
作为自己的输出方式,输入方式任意。
NaDGenLib 关于 IO 的基本原则如下:
- 对于程序的入口(即
main
函数),应当首先使用文件重定向功能将 IO 重定向到指定文件。 - 在将 IO 重定向到指定文件之后,您就不应该使用任何非 NaDGenLib 所支持的 IO,因为这可能会导致无法预料的错误发生。
- 对于 NaDGenLib 来说,IO 的更新仅限于当前函数内,即在入口处重定向一次,在其他函数的开头处刷新 IO。
- NaDGenLib 保证任何时候所更新的 IO 是有效的,NaDGenLib 不保证若在程序运行过程中对同一文件进行二次重定向时,文件原本的内容是否被保留。
将当前 IO 重定向到指定文件上,并刷新当前函数内的 IO 流。
void RedirectToFile(
[in] string filename
);
[in] filename
类型:string
要重定向到的文件名,若该值为 con
,则重定向到控制台。
若重定向过程中发生错误,则会出发断言失败并终止程序。
断言失败时,程序将会以 Segmentation fault
的方式终止程序,详细终止信息请看断言输出。
注意,当使用该函数后,请使用 cout
作为您的输出。
注意,除非使用函数 AutoGenerate
,否则在任何情况下,请务必在入口处先调用该函数。
注意,使用该头文件时,请不要使用 freopen 等重定向方式,这可能会导致原先的文件重定向失效。
依照用户规则自动进行文件重定向,并执行用户自定义的生成方案函数。
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
将会把当前正在生成数据的编号传递给您自定义的生成方案函数。
用于刷新当前函数内的 IO 重定向。
void FlushIOStream()
无
注意,滥用此函数可能会导致编译错误。