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

fputs(), fgets(), ferror() questions and C++ equivalents

本文关键字:C++ 等价物 fgets fputs ferror 问题      更新时间:2023-10-16

所以我正在读一本关于用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()确实返回了一个错误,为什么"continue"会起作用?难道不需要先用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()确实返回了一个错误,为什么"continue"会工作-这似乎不正确。

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

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')。