赞
踩
《C++ Primer》第17章 标准库特殊设施
17.5节 IO库再探 习题答案
练习17.34:编写一个程序,展示如何使用表17.17和17.18中的每个操纵符。
【出题思路】
本题练习格式化输出。
【解答】
- #include <cstddef>
- #include <iostream>
- #include <string>
- #include <iomanip>
-
- using namespace std;
-
- #include <bitset>
- using std::bitset;
-
- bool get_status()
- {
- return false;
- }
-
- int main()
- {
- bool b;
- cout << "default bool values: " << true << " "
- << false << "\nalpha bool values:" << boolalpha
- << true << " " << false << endl;
- bool bool_val = get_status();
- cout << boolalpha //设置cout的内部状态
- << bool_val
- << noboolalpha;//重置内部状态为默认格式
- cout << endl;
-
- const int ival = 15, jval = 1024;//const,因此值永远不变
- cout << "default: " << 20 << " " << 1024 << endl;
- cout << "octal: " << oct << 20 << " " << 1024 << endl;
- cout << "hex: " << hex << 20 << " " << 1024 << endl;
- cout << "decimal: " << dec << 20 << " " << 1024 << endl;
- cout << showbase;//打印整型值时显示基
- cout << "default: " << 20 << " " << 1024 << endl;
- cout << "octal: " << oct << 20 << " " << 1024 << endl;
- cout << "hex: " << hex << 20 << " " << 1024 << endl;
- cout << "decimal: " << dec << 20 << " " << 1024 << endl;
- cout << noshowbase;//重置流的状态
- cout << 10.0 << endl;//打印10
- cout << showpoint << 10.0 //打印10.0000
- << noshowpoint << endl; //恢复小数点的默认模式
- cout << showpos << 10.0 << endl;//非负数打印+
- cout << noshowpos << 10.0 << endl;//非负数不打印+
-
- cout << uppercase << showbase << hex
- << "printed in hexadecimal: " << 20 << " " << 1024
- << nouppercase << noshowbase << dec << endl;
-
- int i = -16;
- double d = 3.14159;
- //补白第一列,使用输出中最小12个位置
- cout << "i: " << setw(12) << i << " next col " << '\n'
- << "d: " << setw(12) << d << " next col " << '\n';
- //补白第一列,左对齐所有列
- cout << left
- << "i: " << setw(12) << i << " next col " << '\n'
- << "d: " << setw(12) << d << " next col " << '\n'
- << right; //恢复正常对齐
-
- //补白第一列,右对齐所有列
- cout << right
- << "i: " << setw(12) << i << " next col " << '\n'
- << "d: " << setw(12) << d << " next col " << '\n';
-
- //补白第一列,但补在域内部
- cout << internal
- << "i: " << setw(12) << i << " next col " << '\n'
- << "d: " << setw(12) << d << " next col " << '\n';
-
- //补白第一列,用#作为补白字符
- cout << setfill('#')
- << "i: " << setw(12) << i << " next col " << '\n'
- << "d: " << setw(12) << d << " next col " << '\n'
- << setfill(' ');
-
- cout << unitbuf;//所有输出操作后都会立即刷新缓冲区
- cout << "default format: " << 100 * sqrt(2.0) << '\n'
- << "scientific: " << scientific << 100 * sqrt(2.0) << '\n'
- << "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'
- << endl << endl;
- cout << nounitbuf;//回到正常的缓冲方式
- cout << "hi!" << endl;//输出hi和一个换行,然后刷新缓冲区
- cout << "hi!" << flush;//输出hi,然后刷新缓冲区,不附加任何额外字符
- cout << "hi!" << ends;//输出hi和一个空字符,然后刷新缓冲区
-
- char ch;
- cin >> noskipws;//设置cin读取空白符
-
- while(cin >> ch)
- cout << ch;
- cin >> skipws; //将cin恢复到默认状态,从而丢弃空白符
-
- return 0;
- }
运行结果:
练习17.35:修改第670页中的程序,打印2的平方根,但这次打印十六进制数字的大写形式。
【出题思路】
本题练习浮点数十六进制的输出。
【解答】
用hexfloat指定浮点数并打印成十六进制,用uppercase指定打印大写形式:
cout << "hexadecimal: " << hexfloat << uppercase << sqrt(2.0) << '\n'
练习17.36:修改上一题中的程序,打印不同的浮点数,使它们排成一列。
【出题思路】
本题练习输出宽度和对齐的设置。
【解答】
用left指定左对齐,并用setw指定浮点数之前的文字以固定宽度显示,即可实现浮点数在一列上对齐。
- cout << left
- << setw(20) << "default format: " << 100 * sqrt(2.0) << '\n'
- << setw(20) << "scientific: " << scientific << 100 * sqrt(2.0) << '\n'
- << setw(20) << "fixed decimal: " << fixed << 100 * sqrt(2.0) << '\n'
- << setw(20) << "hexadecimal: " << hexfloat << 100 * sqrt(2.0) << '\n'
- << setw(20) << "use defaults: " << defaultfloat << 100 * sqrt(2.0) << '\n'
- << "\n\n" << right;
练习17.37:用未格式化版本的getline逐行读取一个文件。测试你的程序,给它一个文件,既包含空行又包含长度超过你传递给getline的字符数组大小的行。
【出题思路】
本题练习非格式化输入。
【解答】
用成员函数版本的getline从输入文件一行一行读取文本。但getline有一个特性需要注意:若读取的字符数达到指定上限时仍未遇到分界符,则getline会将流的状态置为fail。因此,程序中会判断这种情况,调用clear将流重置为valid状态。
- #include <iostream>
- #include <fstream>
-
- using namespace std;
-
- int main(int argc, char *argv[])
- {
- if(argc != 2){
- cerr << "usage:execise infile_name" << endl;
- return -1;
- }
-
- ifstream in(argv[1]);
- if(!in){
- cerr << "Can not open input file" << endl;
- return -1;
- }
-
- char text[50];
- while(!in.eof()){
- in.getline(text, 30);
- cout << text << endl;
- if(!in.good()){
- if(in.gcount() == 29)
- in.clear();
- else
- break;
- }
- }
-
- return 0;
- }
设置命令行参数
运行结果:
练习17.38:扩展上一题中你的程序,将读入的每个单词打印到它所在的行。
【出题思路】
练习getline达到读取大小上限的处理方法。
【解答】
与上题相比,修改循环内逻辑,读取并打印文本后,并不打印换行。而是在判断未出现fail状态,也就是说,getline读取成功且未达上限时才打印回车。这样即可将分多次读入的一行文本仍然打印成一行。
- cout << text << endl;
- if(!in.good()){
- if(in.gcount() == 29)
- in.clear();
- else
- break;
- }
- else {
- cout << endl;
- }
练习17.39:对本节给出的seek程序,编写你自己的版本。
【出题思路】
本题练习随机读写。
【解答】
参考书中本节内容实现即可,配套网站上有完整程序供对照。有一点需要注意,如果是在Windows平台使用gcc编译器(如tdm-gcc 4.8.1)编译此程序,得到的目标程序在处理Windows格式的文本文件(每行结尾是两个字符,CR——回车,LF——换行)时会产生seek定位不准的情况,处理UNIX格式的文件(行尾只有一个LF)则没有问题。用VC编译得到的目标程序则是相反的情况。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。