当前位置:   article > 正文

《C++ Primer》第17章 17.5节习题答案_c++ primer练习17

c++ primer练习17

《C++ Primer》第17章 标准库特殊设施

17.5节 IO库再探 习题答案

练习17.34:编写一个程序,展示如何使用表17.17和17.18中的每个操纵符。

【出题思路】

本题练习格式化输出。

【解答】

  1. #include <cstddef>
  2. #include <iostream>
  3. #include <string>
  4. #include <iomanip>
  5. using namespace std;
  6. #include <bitset>
  7. using std::bitset;
  8. bool get_status()
  9. {
  10. return false;
  11. }
  12. int main()
  13. {
  14. bool b;
  15. cout << "default bool values: " << true << " "
  16. << false << "\nalpha bool values:" << boolalpha
  17. << true << " " << false << endl;
  18. bool bool_val = get_status();
  19. cout << boolalpha //设置cout的内部状态
  20. << bool_val
  21. << noboolalpha;//重置内部状态为默认格式
  22. cout << endl;
  23. const int ival = 15, jval = 1024;//const,因此值永远不变
  24. cout << "default: " << 20 << " " << 1024 << endl;
  25. cout << "octal: " << oct << 20 << " " << 1024 << endl;
  26. cout << "hex: " << hex << 20 << " " << 1024 << endl;
  27. cout << "decimal: " << dec << 20 << " " << 1024 << endl;
  28. cout << showbase;//打印整型值时显示基
  29. cout << "default: " << 20 << " " << 1024 << endl;
  30. cout << "octal: " << oct << 20 << " " << 1024 << endl;
  31. cout << "hex: " << hex << 20 << " " << 1024 << endl;
  32. cout << "decimal: " << dec << 20 << " " << 1024 << endl;
  33. cout << noshowbase;//重置流的状态
  34. cout << 10.0 << endl;//打印10
  35. cout << showpoint << 10.0 //打印10.0000
  36. << noshowpoint << endl; //恢复小数点的默认模式
  37. cout << showpos << 10.0 << endl;//非负数打印+
  38. cout << noshowpos << 10.0 << endl;//非负数不打印+
  39. cout << uppercase << showbase << hex
  40. << "printed in hexadecimal: " << 20 << " " << 1024
  41. << nouppercase << noshowbase << dec << endl;
  42. int i = -16;
  43. double d = 3.14159;
  44. //补白第一列,使用输出中最小12个位置
  45. cout << "i: " << setw(12) << i << " next col " << '\n'
  46. << "d: " << setw(12) << d << " next col " << '\n';
  47. //补白第一列,左对齐所有列
  48. cout << left
  49. << "i: " << setw(12) << i << " next col " << '\n'
  50. << "d: " << setw(12) << d << " next col " << '\n'
  51. << right; //恢复正常对齐
  52. //补白第一列,右对齐所有列
  53. cout << right
  54. << "i: " << setw(12) << i << " next col " << '\n'
  55. << "d: " << setw(12) << d << " next col " << '\n';
  56. //补白第一列,但补在域内部
  57. cout << internal
  58. << "i: " << setw(12) << i << " next col " << '\n'
  59. << "d: " << setw(12) << d << " next col " << '\n';
  60. //补白第一列,用#作为补白字符
  61. cout << setfill('#')
  62. << "i: " << setw(12) << i << " next col " << '\n'
  63. << "d: " << setw(12) << d << " next col " << '\n'
  64. << setfill(' ');
  65. cout << unitbuf;//所有输出操作后都会立即刷新缓冲区
  66. cout << "default format: " << 100 * sqrt(2.0) << '\n'
  67. << "scientific: " << scientific << 100 * sqrt(2.0) << '\n'
  68. << "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'
  69. << endl << endl;
  70. cout << nounitbuf;//回到正常的缓冲方式
  71. cout << "hi!" << endl;//输出hi和一个换行,然后刷新缓冲区
  72. cout << "hi!" << flush;//输出hi,然后刷新缓冲区,不附加任何额外字符
  73. cout << "hi!" << ends;//输出hi和一个空字符,然后刷新缓冲区
  74. char ch;
  75. cin >> noskipws;//设置cin读取空白符
  76. while(cin >> ch)
  77. cout << ch;
  78. cin >> skipws; //将cin恢复到默认状态,从而丢弃空白符
  79. return 0;
  80. }

运行结果:

练习17.35:修改第670页中的程序,打印2的平方根,但这次打印十六进制数字的大写形式。

【出题思路】

本题练习浮点数十六进制的输出。

【解答】

用hexfloat指定浮点数并打印成十六进制,用uppercase指定打印大写形式:

cout << "hexadecimal: " << hexfloat << uppercase << sqrt(2.0) << '\n'

练习17.36:修改上一题中的程序,打印不同的浮点数,使它们排成一列。

【出题思路】

本题练习输出宽度和对齐的设置。

【解答】

用left指定左对齐,并用setw指定浮点数之前的文字以固定宽度显示,即可实现浮点数在一列上对齐。

  1. cout << left
  2. << setw(20) << "default format: " << 100 * sqrt(2.0) << '\n'
  3. << setw(20) << "scientific: " << scientific << 100 * sqrt(2.0) << '\n'
  4. << setw(20) << "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'
  5. << setw(20) << "hexadecimal: " << hexfloat << 100 * sqrt(2.0) << '\n'
  6. << setw(20) << "use defaults: " << defaultfloat << 100 * sqrt(2.0) << '\n'
  7. << "\n\n" << right;

练习17.37:用未格式化版本的getline逐行读取一个文件。测试你的程序,给它一个文件,既包含空行又包含长度超过你传递给getline的字符数组大小的行。

【出题思路】

本题练习非格式化输入。

【解答】

用成员函数版本的getline从输入文件一行一行读取文本。但getline有一个特性需要注意:若读取的字符数达到指定上限时仍未遇到分界符,则getline会将流的状态置为fail。因此,程序中会判断这种情况,调用clear将流重置为valid状态。

  1. #include <iostream>
  2. #include <fstream>
  3. using namespace std;
  4. int main(int argc, char *argv[])
  5. {
  6. if(argc != 2){
  7. cerr << "usage:execise infile_name" << endl;
  8. return -1;
  9. }
  10. ifstream in(argv[1]);
  11. if(!in){
  12. cerr << "Can not open input file" << endl;
  13. return -1;
  14. }
  15. char text[50];
  16. while(!in.eof()){
  17. in.getline(text, 30);
  18. cout << text << endl;
  19. if(!in.good()){
  20. if(in.gcount() == 29)
  21. in.clear();
  22. else
  23. break;
  24. }
  25. }
  26. return 0;
  27. }

 设置命令行参数

 运行结果:

 

练习17.38:扩展上一题中你的程序,将读入的每个单词打印到它所在的行。

【出题思路】

练习getline达到读取大小上限的处理方法。

【解答】

与上题相比,修改循环内逻辑,读取并打印文本后,并不打印换行。而是在判断未出现fail状态,也就是说,getline读取成功且未达上限时才打印回车。这样即可将分多次读入的一行文本仍然打印成一行。

  1. cout << text << endl;
  2. if(!in.good()){
  3. if(in.gcount() == 29)
  4. in.clear();
  5. else
  6. break;
  7. }
  8. else {
  9. cout << endl;
  10. }

练习17.39:对本节给出的seek程序,编写你自己的版本。

【出题思路】

本题练习随机读写。

【解答】

参考书中本节内容实现即可,配套网站上有完整程序供对照。有一点需要注意,如果是在Windows平台使用gcc编译器(如tdm-gcc 4.8.1)编译此程序,得到的目标程序在处理Windows格式的文本文件(每行结尾是两个字符,CR——回车,LF——换行)时会产生seek定位不准的情况,处理UNIX格式的文件(行尾只有一个LF)则没有问题。用VC编译得到的目标程序则是相反的情况。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/521238
推荐阅读
  

闽ICP备14008679号