所以我正在读一本关于在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....
}
答案 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')未存储。