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

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

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

    //and so on....
}
  • 我不了解fputs()的用法。

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

    (b)如果stdout先前已重定向,并且确实是管道或文件,则可能会出现几个不同的错误。他们在哪里列出?请参阅下面的(c)。

    (c)在上述(b)之后,ferror()似乎没有帮助。它的返回值是否映射到errno的返回值,从而与使用perror()之类的返回值相同?为了执行类似的操作,将常量保存在哪里
      if (ferror() == SYSTEM_ERROR_13)
    

    (d)在上面的代码中,如果fputs()确实返回了错误,为什么“继续”有效?是否需要先使用clearerr()之类的东西清除该错误,否则它将反复失败?
  • 是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)可能出现不同的错误。他们在哪里列出? -写入标​​准输出失败的原因真的很重要吗?您确定要深入吗?

    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/

    10-10 21:38