因此,我正在读一本关于用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()之类的东西清除该错误,否则它将反复失败?
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/