裁剪与依赖

根模块能力依赖
XRT_MODULE_IO自定义 Reader/Writer、内存适配器、Copycore
XRT_MODULE_IO_BUFFERBuffer Reader/Writer、ReadAllio, buffer
XRT_MODULE_IO_FILE文件借用/接管/路径构造器io, file
XRT_MODULE_IO_LINE有界流式逐行读取io, buffer

各模块不反向依赖。只使用内存 IO 不会带入 Buffer、路径、时间或文件系统;Line Reader 不会拉入文件适配器或字符串高级功能。

对象契约

xreader 和 xwriter 是不透明对象。同一对象不提供内部并发串行化;多个线程或协程共享时,调用方必须在外部同步。

Reader 的非零 Read 成功返回零字节表示永久 EOF。EOF 会被对象锁定,后续读取直接返回零;成功 xrtReaderSeek 后解除。Writer 的非零写入不能成功返回零字节,该结果会转换为 XIO_ERROR_NO_PROGRESS,从而保证 Full 和 Copy 循环不会卡死。

xrtReaderDestroy 和 xrtWriterDestroy 对空指针为空操作。销毁一定释放对象,即使 Close 失败。Writer 销毁不会隐式调用 xrtWriterFlush:对文件而言,Flush 可能执行昂贵的持久化提交,必须由调用方明确选择。

回调收到的缓冲只在本次调用期间有效。回调返回 false 时应设置当前 xerror;没有设置时,IO 层补充 xrt.io 错误。回调返回超过请求量的计数属于实现契约错误。

类型

xseek 是文件与通用 IO 共用的定位原点枚举:XSEEK_START、XSEEK_CURRENT 和 XSEEK_END 分别以开头、当前游标和末尾为基准。

xreadproc 和 xwriteproc 分别执行一次允许短操作的同步读写。xseekproc、xtellproc、xsizeproc、xflushproc 和 xcloseproc 是可选能力。

xreaderops 只有 Read 必需,xwriterops 只有 Write 必需。创建函数复制整个回调表,因此回调表本身可以位于栈上;Context 的生命周期由调用方和可选 Close 共同决定。

xioerror 使用稳定域 xrt.io:

代码含义
XIO_ERROR_READReader 回调失败
XIO_ERROR_WRITEWriter 回调失败
XIO_ERROR_SEEK定位失败或不支持
XIO_ERROR_TELL游标查询失败或不支持
XIO_ERROR_SIZE大小查询失败或不支持
XIO_ERROR_FLUSH显式刷新失败
XIO_ERROR_CLOSE销毁时关闭失败
XIO_ERROR_EOFFull 或 CopyN 提前遇到 EOF
XIO_ERROR_NO_PROGRESSWriter 对非零请求未消费数据
XIO_ERROR_LIMITReadAll、CopyLimit 或 Line Reader 超过硬上限
XIO_ERROR_CALLBACK回调返回不合法计数

Line Reader

Line Reader 是通用 xreader 上的可选动态缓冲层。对象本身不包含固定 4K/8K 数组;第一次读取时才按需申请容量,长行按几何策略增长,并始终受调用方设置的内容字节上限约束。

xlineview.Text 不执行 UTF-8 校验,可以包含零字节,也不保证额外补零。视图借用内部缓冲,只在下一次 xrtLineReaderNext 或销毁前有效。LF 和 CRLF 会从内容中剥离并通过 End 明确返回;输入末尾没有终止符时返回 XLINE_END_NONE。终止换行之后不会额外产生一条空行,而输入中的真实空行会正常返回。

示例

完整范例位于 examples/io/memory、examples/io/buffer、examples/io/file 和 examples/io/line。

xlineend类型

行结束类型区分无终止符的末行、LF 与 CRLF。

值语义
XLINE_END_NONE无
XLINE_END_LFLF
XLINE_END_CRLFCRLF 结尾
typedef enum xlineend { XLINE_END_NONE = 0, XLINE_END_LF, XLINE_END_CRLF } xlineend;

xlinenext类型

行迭代结果明确区分正常结束、有效行和失败。

值语义
XLINE_NEXT_ERROR失败
XLINE_NEXT_ENDEND
XLINE_NEXT_LINE已产出行
typedef enum xlinenext { XLINE_NEXT_ERROR = -1, XLINE_NEXT_END = 0, XLINE_NEXT_LINE = 1 } xlinenext;

xlineview类型

行内容借用到下一次迭代或销毁,不执行编码检查且不保证补零。

字段类型语义
Textxstrview文本视图
Endxlineend结束
typedef struct xlineview { xstrview Text; xlineend End; } xlineview;

xioerror类型

IO 层稳定错误代码使用 xrt.io 域。

值语义
XIO_ERROR_READ读方向
XIO_ERROR_WRITE写方向
XIO_ERROR_SEEK失败
XIO_ERROR_TELL失败
XIO_ERROR_SIZE尺寸
XIO_ERROR_FLUSH刷新
XIO_ERROR_CLOSE失败
XIO_ERROR_EOF失败
XIO_ERROR_NO_PROGRESS失败
XIO_ERROR_LIMIT超限
XIO_ERROR_CALLBACK回调失败
typedef enum xioerror { XIO_ERROR_READ = 1, XIO_ERROR_WRITE, XIO_ERROR_SEEK, XIO_ERROR_TELL, XIO_ERROR_SIZE, XIO_ERROR_FLUSH, XIO_ERROR_CLOSE, XIO_ERROR_EOF, XIO_ERROR_NO_PROGRESS, XIO_ERROR_LIMIT, XIO_ERROR_CALLBACK } xioerror;

xreaderops类型

Reader 回调表会在创建时复制;只有 Read 是必需过程。

字段类型语义
ReadxreadprocRead
SeekxseekprocSeek
TellxtellprocTell
Sizexsizeproc字节数
ClosexcloseprocClose
typedef struct xreaderops { xreadproc Read; xseekproc Seek; xtellproc Tell; xsizeproc Size; xcloseproc Close; } xreaderops;

xwriterops类型

Writer 回调表会在创建时复制;只有 Write 是必需过程。

字段类型语义
WritexwriteprocWrite
SeekxseekprocSeek
TellxtellprocTell
Sizexsizeproc字节数
FlushxflushprocFlush
ClosexcloseprocClose
typedef struct xwriterops { xwriteproc Write; xseekproc Seek; xtellproc Tell; xsizeproc Size; xflushproc Flush; xcloseproc Close; } xwriterops;

xreader类型

Reader 和 Writer 是同步字节 IO 对象;同一对象的操作必须由调用方串行化。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xreader xreader;

xwriter类型

同步字节 Writer 对象(不透明);同一对象的操作必须由调用方串行化。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xwriter xwriter;

xlinereader类型

Line Reader 在通用 Reader 上提供有界流式行迭代。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xlinereader xlinereader;

xreadproc类型

Read 和 Write 允许短操作;成功读取零字节只表示 EOF。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xreadproc)( ptr pContext, ptr pBuffer, size_t iRequest, size_t* pRead)

xwriteproc类型

写入回调:向 pContext 写入至多 iRequest 字节,pWritten 返回实际写入数,false 表示失败。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xwriteproc)( ptr pContext, const void* pBuffer, size_t iRequest, size_t* pWritten)

xseekproc类型

可选定位、查询、刷新和关闭过程失败时必须设置当前错误。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xseekproc)( ptr pContext, int64 iOffset, xseek Origin, uint64* pPosition)

xtellproc类型

位置查询回调:返回 pContext 当前读写位置,false 表示对象不可寻址。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xtellproc)(ptr pContext, uint64* pPosition)

xsizeproc类型

大小查询回调:返回 pContext 内容总字节数,false 表示大小不可知。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xsizeproc)(ptr pContext, uint64* pSize)

xflushproc类型

冲刷回调:把 pContext 已缓冲数据提交到后端,false 表示失败。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xflushproc)(ptr pContext)

xcloseproc类型

关闭回调:释放 pContext 的后端资源;返回值保留供扩展,当前实现忽略。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef bool(*xcloseproc)(ptr pContext)
Reader 构造

xrtReaderCreate函数

创建自定义 Reader;失败时 Context 所有权不变,销毁时调用一次 Close。

xreader* xrtReaderCreate(const xreaderops* pOps, ptr pContext)

参数

参数方向约束说明
pOps输入非空、静态存储操作表
pContext输入成功后归 Reader自定义上下文
返回值
返回含义失败时状态
非空自定义 Reader—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 构造 · 观察

	pCustom = xrtReaderCreate(&ReaderOps, &Mem);

xrtReaderFromMemory函数

创建借用固定字节视图的可定位 Reader。

xreader* xrtReaderFromMemory(xbytesview Data)

参数

参数方向约束说明
Data输入借用、存活期覆盖 Reader字节视图
返回值
返回含义失败时状态
非空可定位 Reader(Size/Tell/Seek 全支持)—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/line · 内存 · 观察

	pReader = xrtReaderFromMemory(XRT_BYTES_LITERAL(sLog));

xrtReaderFromBuffer函数

创建借用 Buffer 的 Reader;使用期间不得修改或销毁 Buffer。

xreader* xrtReaderFromBuffer(const xbuffer* pBuffer)

参数

参数方向约束说明
pBuffer输入非空、借用Buffer
返回值
返回含义失败时状态
非空可定位 Reader—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 缓冲 · 观察

			xreader* pBorrowed = xrtReaderFromBuffer(pBuffer);

xrtReaderTakeBuffer函数

接管 Buffer 并创建 Reader;成功时把调用方槽清空。

xreader* xrtReaderTakeBuffer(xbuffer** ppBuffer)

参数

参数方向约束说明
ppBuffer输入/输出非空成功后槽被清空
返回值
返回含义失败时状态
非空Reader(拥有 Buffer)—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 缓冲 · 观察

		xreader* pBufReader = xrtReaderTakeBuffer(&pBuffer);

xrtReaderFromFile函数

创建借用文件对象的 Reader。

xreader* xrtReaderFromFile(xfile File)

参数

参数方向约束说明
File输入非空、借用文件对象
返回值
返回含义失败时状态
非空可定位 Reader—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 文件 · 观察

			xrtReaderFromFile(FileB) : NULL;

xrtReaderTakeFile函数

接管文件对象并创建 Reader;成功时把调用方槽清空。

xreader* xrtReaderTakeFile(xfile* pFile)

参数

参数方向约束说明
pFile输入/输出非空成功后槽被清空
返回值
返回含义失败时状态
非空Reader(拥有文件)—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 文件 · 观察

			xreader* pTaken = xrtReaderTakeFile(&FileB);

xrtReaderOpen函数

打开路径并创建拥有文件对象的 Reader。

xreader* xrtReaderOpen(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
非空Reader(拥有内部打开的文件)—
NULL打开失败xrt.io 域错误
错误
  • xrt.io 域错误 — 打开失败
  • XERR_MEMORY

范例已编译验证

io/file · 文件 · 观察

	pReader = xrtReaderOpen(sPath);
Reader 读取与复制

xrtReaderRead函数

单次读取;成功读取零字节表示并锁定 EOF,直到下一次成功 Seek。

bool xrtReaderRead(xreader* pReader, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
pReader输入非空Reader
pBuffer输出非空(非零请求)接收缓冲
iRequest输入—请求字节数
pRead输出可空实际读取量
返回值
返回含义失败时状态
true已读取(可短读;零 = EOF)—
false参数或底层错误*pRead 语义不定
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 读取 · 观察

		!xrtReaderRead(pReader, Out, 4u, &iRead) ||

xrtReaderReadFull函数

持续读取到填满缓冲;提前 EOF 返回失败并保留实际读取量。

bool xrtReaderReadFull(xreader* pReader, ptr pBuffer, size_t iRequest, size_t* pRead)

参数

参数方向约束说明
pReader输入非空Reader
pBuffer输出非空接收缓冲
iRequest输入—请求字节数
pRead输出可空已读量(失败保留)
返回值
返回含义失败时状态
true缓冲已填满—
false提前 EOF 或底层错误*pRead 保留
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/file · 读取 · 观察

		 xrtReaderReadFull(pReader, arrData, sizeof(arrData), NULL) ) {

xrtReaderCopy函数

持续复制到输入 EOF;使用固定大小栈缓冲且不随数据量分配。

bool xrtReaderCopy(xreader* pReader, xwriter* pWriter, uint64* pCopied)

参数

参数方向约束说明
pReader输入非空源
pWriter输入非空目标
pCopied输出可空累计复制量
返回值
返回含义失败时状态
true已复制到 EOF—
false底层错误*pCopied 保留
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/memory · 复制 · 观察

		 xrtReaderCopy(pReader, pWriter, &iCopied) ) {

xrtReaderCopyN函数

精确复制指定字节数;输入提前 EOF 时返回失败和已复制量。

bool xrtReaderCopyN(xreader* pReader, xwriter* pWriter, uint64 iSize, uint64* pCopied)

参数

参数方向约束说明
pReader输入非空源
pWriter输入非空目标
iSize输入—精确字节数
pCopied输出可空已复制量
返回值
返回含义失败时状态
true已复制 iSize 字节—
false提前 EOF 或错误*pCopied 保留
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 复制 · 观察

		!xrtReaderCopyN(pReader, pWriter, 5u, &uCopied) ||

xrtReaderCopyLimit函数

在硬上限内复制到 EOF;超限时返回范围错误。探测字节留在 Reader 内,下次读取仍会返回该字节;Tell 和相对 Seek 使用未消费探测字节的逻辑位置。

bool xrtReaderCopyLimit(xreader* pReader, xwriter* pWriter, uint64 iLimit, uint64* pCopied)

参数

参数方向约束说明
pReader输入非空源
pWriter输入非空目标
iLimit输入—硬上限
pCopied输出可空已复制量
返回值
返回含义失败时状态
trueEOF 且未超限—
false超限或错误超限时 *pCopied 为 iLimit;探测字节没有写入目标或从逻辑 Reader 消费
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_RANGE — 输入超过硬上限

范例已编译验证

io/stream_tour · 复制 · 观察

		!xrtReaderCopyLimit(pReader, pWriter, 64u, &uCopied) ||

xrtReaderCopyUpTo函数

最多复制 Limit 个字节,正常提前 EOF 返回 true。与 CopyN 的“必须恰好” 和 CopyLimit 的“完整流必须不超过”区分;零上限不消费输入,达到上限 不探测下一字节。失败时 Copied 保留已经写入的数量;两端不关闭。

bool xrtReaderCopyUpTo(xreader* Reader, xwriter* Writer, uint64 Limit, uint64* Copied)
`xrtReaderStdin` / `xrtWriterStdout` / `xrtWriterStderr`

xrtReaderReadAll函数

在硬上限内读取到新 Buffer;超限时探测字节留在 Reader 内供下次读取。错误前已读取的内容仍然被消费,失败不会回滚整次读取。

xbuffer* xrtReaderReadAll(xreader* pReader, size_t iLimit)

参数

参数方向约束说明
pReader输入非空Reader
iLimit输入—硬上限
返回值
返回含义失败时状态
非空拥有全部剩余内容的 Buffer—
NULL超限、OOM 或读取失败—
错误
  • XERR_RANGE — 内容超过上限
  • XERR_MEMORY
  • 底层读取错误

范例已编译验证

io/stream_tour · 缓冲 · 观察

	pReadAll = xrtReaderReadAll(pReader, 64u);
Reader 定位与查询

xrtReaderSeek函数

移动 Reader 游标;成功后清除已锁定的 EOF。

bool xrtReaderSeek(xreader* pReader, int64 iOffset, xseek Origin, uint64* pPosition)

参数

参数方向约束说明
pReader输入非空Reader
iOffset输入可负偏移
Origin输入—基准
pPosition输出可空新位置
返回值
返回含义失败时状态
true游标已移动、EOF 解锁—
false不支持或越界—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/stream_tour · 定位 · 观察

	if ( !xrtReaderSeek(pReader, 2, XSEEK_START, &uPos) ||
		!xrtReaderRead(pReader, Out, 4u, &iRead) ||
		(memcmp(Out, "2345", 4u) != 0) ||
		!xrtReaderTell(pReader, &uPos) || (uPos != 6u) ||
		xrtReaderEOF(pReader) ) {

xrtReaderTell函数

查询 Reader 游标;不支持时返回 XERR_UNSUPPORTED。

bool xrtReaderTell(xreader* pReader, uint64* pPosition)

参数

参数方向约束说明
pReader输入非空Reader
pPosition输出非空游标位置
返回值
返回含义失败时状态
true位置已写出—
false不支持或参数错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtReaderTell(pReader, &uPos) || (uPos != 4u) ) {

xrtReaderSize函数

查询 Reader 当前总大小;不支持时返回 XERR_UNSUPPORTED。

bool xrtReaderSize(xreader* pReader, uint64* pSize)

参数

参数方向约束说明
pReader输入非空Reader
pSize输出非空总大小
返回值
返回含义失败时状态
true大小已写出—
false不支持或参数错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtReaderSize(pReader, &uSize) ||

xrtReaderCanSeek函数

判断 Reader 是否提供定位能力。

bool xrtReaderCanSeek(const xreader* pReader)

参数

参数方向约束说明
pReader输入非空Reader
返回值
返回含义失败时状态
true支持 Seek/Tell—
false不支持或参数错误纯查询
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtReaderCanSeek(pReader) ||

xrtReaderCanSize函数

判断 Reader 是否提供大小查询能力。

bool xrtReaderCanSize(const xreader* pReader)

参数

参数方向约束说明
pReader输入非空Reader
返回值
返回含义失败时状态
true支持 Size—
false不支持或参数错误纯查询
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtReaderCanSize(pReader) ||

xrtReaderEOF函数

判断 Reader 是否已通过非零请求观察到 EOF。

bool xrtReaderEOF(const xreader* pReader)

参数

参数方向约束说明
pReader输入非空Reader
返回值
返回含义失败时状态
trueEOF 已锁定—
false未观察或参数错误纯查询
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 定位 · 观察

		xrtReaderEOF(pReader) ) {
Reader 销毁

xrtReaderDestroy函数

调用一次 Close 并销毁 Reader;Close 失败也一定释放对象。

bool xrtReaderDestroy(xreader* pReader)

参数

参数方向约束说明
pReader输入允许空空 = 空操作
返回值
返回含义失败时状态
trueClose 成功且已释放—
falseClose 失败(对象仍释放)错误经 xrtGetError() 报告
错误
  • 底层错误 — Close 失败;对象总是被释放

范例已编译验证

io/file · 生命周期 · 观察

	xrtReaderDestroy(pReader);
行读取

xrtLineReaderCreate函数

创建借用 Reader 的 Line Reader;最大行长只计算终止符之前的内容字节。

xlinereader* xrtLineReaderCreate(xreader* pReader, size_t iMaxLine)

参数

参数方向约束说明
pReader输入非空、借用底层 Reader
iMaxLine输入> 0内容字节上限
返回值
返回含义失败时状态
非空Line Reader—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 行读取 · 观察

		pLines = xrtLineReaderCreate(pFileReader, 64u);

xrtLineReaderTake函数

原子接管 Reader 槽;成功时清空来源,失败时所有权保持不变。

xlinereader* xrtLineReaderTake(xreader** ppReader, size_t iMaxLine)

参数

参数方向约束说明
ppReader输入/输出非空成功后槽被清空
iMaxLine输入> 0内容字节上限
返回值
返回含义失败时状态
非空Line Reader(拥有底层)—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/line · 行读取 · 观察

	pLines = xrtLineReaderTake(&pReader, 1024u);

xrtLineReaderNext函数

返回下一行借用视图;超限或底层读取失败后对象进入失败状态。

xlinenext xrtLineReaderNext(xlinereader* pLines, xlineview* pLine)

参数

参数方向约束说明
pLines输入非空Line Reader
pLine输出非空接收行视图(借用)
返回值
返回含义失败时状态
XLINE_NEXT_LINE一行已发布—
XLINE_NEXT_ENDEOF不设错
XLINE_NEXT_ERROR超限或读取失败对象锁定失败态
错误
  • 行超限或底层读取错误(对象进入失败状态)

范例已编译验证

io/line · 行读取 · 观察

	while ( (Next = xrtLineReaderNext(pLines, &Line)) == XLINE_NEXT_LINE ) {

xrtLineReaderDestroy函数

释放 Line Reader;接管模式同时销毁底层 Reader 并返回关闭结果。

bool xrtLineReaderDestroy(xlinereader* pLines)

参数

参数方向约束说明
pLines输入允许空空 = 空操作
返回值
返回含义失败时状态
true已释放(接管模式含底层)—
false底层 Close 失败(仍释放)错误经 xrtGetError() 报告
错误
  • 底层错误 — Close 失败;对象总是被释放

范例已编译验证

io/line · 行读取 · 观察

	if ( !xrtLineReaderDestroy(pLines) ) {
Writer 构造

xrtWriterCreate函数

创建自定义 Writer;失败时 Context 所有权不变,销毁时调用一次 Close。

xwriter* xrtWriterCreate(const xwriterops* pOps, ptr pContext)

参数

参数方向约束说明
pOps输入非空、静态存储操作表
pContext输入成功后归 Writer自定义上下文
返回值
返回含义失败时状态
非空自定义 Writer—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 构造 · 观察

	pSink = xrtWriterCreate(&WriterOps, &Sink);

xrtWriterFromMemory函数

创建借用固定容量的可定位 Writer;稀疏写入产生的空洞会填零。

xwriter* xrtWriterFromMemory(ptr pData, size_t iCapacity)

参数

参数方向约束说明
pData输入非空、可写输出缓冲
iCapacity输入—容量
返回值
返回含义失败时状态
非空可定位 Writer—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/memory · 内存 · 观察

	xwriter* pWriter = xrtWriterFromMemory(
		arrOutput,
		sizeof(arrOutput)
	);

xrtWriterDiscard函数

创建只统计并丢弃全部输入的 Writer。

xwriter* xrtWriterDiscard()

参数

参数方向约束说明
无——无参数
返回值
返回含义失败时状态
非空丢弃型 Writer—
NULLOOMXERR_MEMORY
错误
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 构造 · 观察

			xwriter* pDiscard = xrtWriterDiscard();

xrtWriterFromBuffer函数

创建借用 Buffer 的 Writer,初始游标位于已有内容末尾。

xwriter* xrtWriterFromBuffer(xbuffer* pBuffer)

参数

参数方向约束说明
pBuffer输入非空、可写、借用Buffer
返回值
返回含义失败时状态
非空Writer(追加语义)—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/buffer · 缓冲 · 观察

	pWriter = xrtWriterFromBuffer(&Buffer);

xrtWriterFromFile函数

创建借用文件对象的 Writer。

xwriter* xrtWriterFromFile(xfile File)

参数

参数方向约束说明
File输入非空、借用文件对象
返回值
返回含义失败时状态
非空Writer—
NULL参数错误或 OOM—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 文件 · 观察

			xrtWriterFromFile(FileW) : NULL;

xrtWriterTakeFile函数

接管文件对象并创建 Writer;成功时把调用方槽清空。

xwriter* xrtWriterTakeFile(xfile* pFile)

参数

参数方向约束说明
pFile输入/输出非空成功后槽被清空
返回值
返回含义失败时状态
非空Writer(拥有文件)—
NULL参数错误或 OOM所有权不变
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 文件 · 观察

		pTakeWriter = xrtWriterTakeFile(&FileC);

xrtWriterOpen函数

创建或截断路径并创建拥有文件对象的 Writer。

xwriter* xrtWriterOpen(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
非空Writer(拥有内部打开的文件)—
NULL打开失败xrt.io 域错误
错误
  • xrt.io 域错误
  • XERR_MEMORY

范例已编译验证

io/file · 文件 · 观察

	xwriter* pWriter = xrtWriterOpen(sPath);   /* 拥有式:Destroy 关文件 */

xrtWriterOpenAppend函数

以操作系统追加语义打开路径并创建拥有文件对象的 Writer。

xwriter* xrtWriterOpenAppend(cstr sPath)

参数

参数方向约束说明
sPath输入非空、UTF-8路径
返回值
返回含义失败时状态
非空追加语义 Writer—
NULL打开失败xrt.io 域错误
错误
  • xrt.io 域错误
  • XERR_MEMORY

范例已编译验证

io/stream_tour · 文件 · 观察

	pAppend = xrtWriterOpenAppend("xrt-io-tour.tmp");
Writer 写入

xrtWriterWrite函数

单次写入,允许成功短写但拒绝非零请求不产生进展。

bool xrtWriterWrite(xwriter* pWriter, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
pWriter输入非空Writer
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空实际写入量
返回值
返回含义失败时状态
true已写入(可短写;零进展拒绝)—
false参数或底层错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 写入 · 观察

		!xrtWriterWrite(pAppend, "cd\n", 3u, &iRead) ||

xrtWriterWriteFull函数

持续写入到全部完成;失败时保留实际写入量。

bool xrtWriterWriteFull(xwriter* pWriter, const void* pBuffer, size_t iRequest, size_t* pWritten)

参数

参数方向约束说明
pWriter输入非空Writer
pBuffer输入借用写入数据
iRequest输入—请求字节数
pWritten输出可空已写量(失败保留)
返回值
返回含义失败时状态
true全部写入—
false底层错误*pWritten 保留
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/buffer · 写入 · 观察

		 xrtWriterWriteFull(pWriter, "hello world", 11u, NULL) &&

xrtWriterFlush函数

显式刷新 Writer;没有 Flush 回调时为空操作。

bool xrtWriterFlush(xwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空Writer
返回值
返回含义失败时状态
true已刷新(或无回调)—
false底层错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 写入 · 观察

		!xrtWriterFlush(pSink) || (Sink.Flushes != 1) ) {

xrtWriterWriteBuffer函数

完整写入 Buffer 当前有效内容。

bool xrtWriterWriteBuffer(xwriter* pWriter, const xbuffer* pBuffer)

参数

参数方向约束说明
pWriter输入非空Writer
pBuffer输入非空内容源
返回值
返回含义失败时状态
true已完整写入—
false参数或底层错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 缓冲 · 观察

			if ( !xrtWriterWriteBuffer(pWriter, pBuffer) ||
				!xrtWriterTell(pWriter, &uPos) ||
				(uPos != 2u) ) {
Writer 定位与销毁

xrtWriterSeek函数

移动 Writer 游标;不支持时返回 XERR_UNSUPPORTED。

bool xrtWriterSeek(xwriter* pWriter, int64 iOffset, xseek Origin, uint64* pPosition)

参数

参数方向约束说明
pWriter输入非空Writer
iOffset输入可负偏移
Origin输入—基准
pPosition输出可空新位置
返回值
返回含义失败时状态
true游标已移动—
false不支持或越界—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/buffer · 定位 · 观察

		 xrtWriterSeek(pWriter, 6, XSEEK_START, NULL) &&

xrtWriterTell函数

查询 Writer 游标。

bool xrtWriterTell(xwriter* pWriter, uint64* pPosition)

参数

参数方向约束说明
pWriter输入非空Writer
pPosition输出非空游标位置
返回值
返回含义失败时状态
true位置已写出—
false不支持或参数错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/stream_tour · 定位 · 观察

				!xrtWriterTell(pWriter, &uPos) ||

xrtWriterSize函数

查询 Writer 当前逻辑大小。

bool xrtWriterSize(xwriter* pWriter, uint64* pSize)

参数

参数方向约束说明
pWriter输入非空Writer
pSize输出非空逻辑大小
返回值
返回含义失败时状态
true大小已写出—
false不支持或参数错误—
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_UNSUPPORTED — 该 Reader/Writer 不提供定位或大小查询

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtWriterSize(pAppend, &uSize) ||

xrtWriterCanSeek函数

判断 Writer 是否提供定位能力。

bool xrtWriterCanSeek(const xwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空Writer
返回值
返回含义失败时状态
true支持 Seek/Tell—
false不支持或参数错误纯查询
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 定位 · 观察

		!xrtWriterCanSeek(pAppend) ||

xrtWriterCanSize函数

判断 Writer 是否提供大小查询能力。

bool xrtWriterCanSize(const xwriter* pWriter)

参数

参数方向约束说明
pWriter输入非空Writer
返回值
返回含义失败时状态
true支持 Size—
false不支持或参数错误纯查询
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

io/stream_tour · 定位 · 观察

			!xrtWriterCanSize(pFileWriter) ||

xrtWriterDestroy函数

调用一次 Close 并销毁 Writer;不会隐式调用可能昂贵的 Flush。

bool xrtWriterDestroy(xwriter* pWriter)

参数

参数方向约束说明
pWriter输入允许空空 = 空操作
返回值
返回含义失败时状态
trueClose 成功且已释放—
falseClose 失败(对象仍释放)错误经 xrtGetError() 报告
错误
  • 底层错误 — Close 失败;对象总是被释放

范例已编译验证

io/buffer · 生命周期 · 观察

	xrtWriterDestroy(pWriter);
补充参考 · 契约见公共头注释

xrtReaderStdin函数

契约注释见公共头文件。

XRT_EXTERN_C_BEGIN XRT_API xreader* xrtReaderStdin()

xrtWriterStdout函数

契约注释见公共头文件。

XRT_API xwriter* xrtWriterStdout()

xrtWriterStderr函数

契约注释见公共头文件。

XRT_API xwriter* xrtWriterStderr()

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
XIO_ERROR_CALLBACK见头文件注释
XIO_ERROR_CLOSE见头文件注释
XIO_ERROR_EOF见头文件注释
XIO_ERROR_FLUSH见头文件注释
XIO_ERROR_LIMIT见头文件注释
XIO_ERROR_NO_PROGRESS见头文件注释
XIO_ERROR_READ见头文件注释
XIO_ERROR_SEEK见头文件注释
XIO_ERROR_SIZE见头文件注释
XIO_ERROR_TELL见头文件注释
XIO_ERROR_WRITE见头文件注释
XLINE_END_CRLF见头文件注释
XLINE_END_LF见头文件注释
XLINE_END_NONE见头文件注释
XLINE_NEXT_END见头文件注释
XLINE_NEXT_ERROR见头文件注释
XLINE_NEXT_LINE见头文件注释