gpt4 book ai didi

c++ - fputs()、fgets()、ferror() 问题和 C++ 等效项

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:27 25 4
gpt4 key购买 nike

所以我正在阅读一本关于用 C 编写 shell 的书,我想尝试用 C++ 编写它。我遇到了以下代码:

for( ; ; ) 
{
if (fputs(PROMPT, stdout) == EOF)
continue;

if (fgets(inbuf, MAX, stdin) == NULL)
continue;

//and so on....
}
  1. 我不明白这里fputs()的用法。

    (a) 如果 stdout 是终端,EOF 有什么意义吗?除了流可能已经关闭之外,您可以向终端写入什么样的错误?

    (b) 如果 stdout 之前被重定向并且实际上是一个管道或文件,那么可能会出现几个不同的错误。它们在哪里列出?见下文 (c)。

    (c) 在上面的 (b) 之后,ferror() 似乎没有多大帮助。它的返回值是否映射到 errno 的返回值,因此与使用 perror() 之类的东西一样?为了做类似的事情,常量保存在哪里

      if (ferror() == SYSTEM_ERROR_13)

    (d) 在上面的代码中,如果 fputs() 确实返回错误,为什么“继续”会起作用?难道不需要先用 clearerr() 之类的东西清除错误,否则它只会反复失败吗?

  2. 是C++中的等价代码:

    for( ; ; ) 
    {
    if (! cout << PROMPT)
    {
    cout.clear();
    continue;
    }

    if (! getline(cin, inbuf))
    {
    cin.clear();
    continue;
    }

    //and so on....
    }

最佳答案

if (fputs(PROMPT, stdout) == EOF)
continue;

a) 如果 stdout 是终端,EOF 有什么意义吗? - fputs函数在出错时返回 EOF。

b) 似乎可能出现不同的错误。它们列在哪里? - 写入 stdout 失败的原因真的很重要吗?您确定要深入了解吗?

c) ferror() 似乎没有什么帮助...使用类似 perror() 的东西? 它们都基于全局变量 errno 工作。虽然perror对你来说会是更好的选择,因为它以指定的格式输出到 stderr

d) 在上面的代码中,如果 fputs() 确实返回错误,为什么“继续”会起作用? - 这似乎是不正确的。

根据这些事实,它应该是这样的:

if (fputs(PROMPT, stdout) == EOF)
{
perror("The following error occurred");
exit(1);
}

if (fgets(inbuf, MAX, stdin) == NULL)
{
perror("The following error occurred");
continue;
}

2。 C++ 中是否有等效代码? - 否。只有一个区别:fgets读取该行并将 '\n' 包含在字符串中,而 getline读取该行但未存储定界符 ('\n')。

关于c++ - fputs()、fgets()、ferror() 问题和 C++ 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059486/

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