fputs(),fgets(),ferror()问题和C ++等价物

时间:2012-01-30 04:51:38

标签: c++ c

所以我正在读一本关于在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....
    }
    

1 个答案:

答案 0 :(得分:1)

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')未存储。