fputs()、fgets()、ferror()问题和C++等价物
fputs(), fgets(), ferror() questions and C++ equivalents
所以我正在读一本关于用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()确实返回了一个错误,为什么"continue"会起作用?难道不需要先用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)不同的错误似乎是可能的。它们列在哪里-写入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')。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- python集合的C++等价物是什么.计数器
- C++中是否存在 std::conditional 的懒惰等价物?
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- 在本征C++中 MKL 的函数"zgges"等价物是多少?
- 在C++中使用std或boost库的Qtimer等价物是什么
- GLM中的Java Matrix4.transform等价物
- 对于std::bitset,是否有一个ffs()等价物
- std::move() 或其在局部变量上的显式等价物可以允许 elision 吗?
- 这个 matlab 代码的C++等价物是什么(fread matlab vs fread C/C++)?
- 对于wchar_t,字符(0)或'