gpt4 book ai didi

c - 撤消 ungetc() : "How" do fseek(), rewind() 和 fsetpos() 的效果吗?是否每次都重新填充缓冲区?

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:37 25 4
gpt4 key购买 nike

哈!!我该如何把整个事情放在一个清晰的问题中!!让我试试:

我知道使用fopen()打开的文件被缓冲到内存中。我们使用缓冲区来提高效率和方便性。在从文件读取期间,文件的内容首先被读取到缓冲区,然后我们从该缓冲区读取。类似地,在写入文件时,内容先写入缓冲区,然后再写入文件。

但是 fseek()fsetpos()rewind()dropping 的效果如何之前对 ungetc() 的调用?你能告诉我如何它是如何完成的吗?我的意思是,假设我们已经打开一个文件供读取并将其复制到缓冲区中。现在使用 ungetc() 我们已经更改了缓冲区中的一些字符。这是我经过很多努力仍无法理解的内容:

  • 这是关于 ungetc() 的内容 --“对流上的 fseek、fsetpos 或 rewind 的调用将丢弃之前使用此函数放回其中的任何字符。 " -- 已经放入缓冲区的字符如何被丢弃?一种方法是将被删除的原始字符“记住”,并且识别每个放入的新字符并用原始字符替换。但是这似乎非常低效。另一种选择是将原始文件的副本加载到缓冲区并将文件指针放置在预期位置。这两种方法中 fseek、fsetpos 或 rewind 采取哪种方法来丢弃使用 放置的字符ungetc()?

  • 对于文本流,流中未读字符的存在,即使用 ungetc() 放入的字符,如何影响 ftell()< 的返回值?我的困惑来自关于 ftell()ungetc() 的以下行,来自关于 ftell( SOURCE ) 的链接

“对于文本流,数值可能没有意义,但仍可用于稍后使用 fseek 将位置恢复到相同位置(如果使用 ungetc 放回的字符仍在等待处理中阅读,行为未定义)。”

  • 关注上段的最后一行,pending of being read 与“ungetc()-obtained”字符被丢弃有什么关系?每次我们读取一个使用 ungetc() 放入流中的字符时,它是否在读取后被丢弃

最佳答案

一个好的 put back 字符的心理模型很简单,它是一些额外的小属性,它卡在 FILE * 对象上。假设您有:

typedef struct { 
/* ... */
int putback_char;
/* ... */
} FILE;

假设 putback_char 被初始化为值 EOF 表示“没有 putback char”,而 ungetc 只是将字符存储到此成员(member)。

假设每个读取操作都经过 getc,而 getc 会执行如下操作:

int getc(FILE *stream)
{
int ret = stream->putback_char;

if (ret != EOF) {
stream->putback_char = EOF;
if (__is_binary(stream))
stream->current_position--;
return ret;
}

return __internal_getc(stream); /* __internal_getc doesn't know about putback_char */
}

清除回推的函数只需将 EOF 分配给 putback_char

换句话说,放回字符(只需要支持一个)实际上可以是一个独立于常规缓冲区的微型缓冲区。 (考虑到即使是无缓冲流也支持 ungetc:这样的流必须将字节或字符放在某处。)

关于位置指示器,C99标准是这样说的:

For a text stream, the value of its file position indicator after a successful call to the ungetc function is unspecified until all pushed-back characters are read or discarded. For a binary stream, its file position indicator is decremented by each successful call to the ungetc function; if its value was zero before a call, it is indeterminate after the call. [7.19.7.11 The ungetc function]

所以,您使用的 www.cplusplus.com 引用是不正确的;当使用 ungetc 推回未决字符时,ftell 的行为不是未定义的。对于文本流,该值未指定。访问未指定的值不是未定义的行为,因为未指定的值不能是陷阱表示。如果在位置零处发生推回,则二进制流存在未定义的行为,因为该位置随后变得不确定。不确定意味着它是一个未指定的值,可能是陷阱表示。访问它可能会停止程序并显示错误消息,或触发其他行为。

最好从马口中获取编程语言和库规范,而不是从随机网站获取。

关于c - 撤消 ungetc() : "How" do fseek(), rewind() 和 fsetpos() 的效果吗?是否每次都重新填充缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16685695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com