⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chapter11.htm

📁 为清华大学出版社 C++课后答案
💻 HTM
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>




<style type="text/css">
<!--
.style1 {
	font-size: 16px;
	font-weight: bold;
	font-style: italic;
	color: #FF0000;
}
.style2 {font-size: 14px}
-->
</style>
</head>

<body>
<p><span 
      class=style1>&nbsp;第 十一 章 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;流类库与输入/输出</span><br>
</p>
<p> <span class="style2"><strong>11-1 什么叫做流?流的提取和插入是指什么?I/O流在C++中起着怎样的作用?</strong><br>
</span></span></p>
<p class="style2"> 解: <br>
  流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动,一般意义下的读操作在流数据抽象中被称为(从流中)提取,写操作被称为(向流中)插入。操作系统是将键盘、屏幕、打印机和通信端口作为扩充文件来处理的,I/O流类就是用来与这些扩充文件进行交互,实现数据的输入与输出。<br>
</span></p>
<p class="style2"> <strong>11-2 cerr和clog有何区别?</strong><br>
</span></p>
<p class="style2"> 解: <br>
  cerr 标准错误输出,没有缓冲,发送给它的内容立即被输出,适用于立即向屏幕输出的错误信息;clog 类似于cerr,但是有缓冲,缓冲区满时被输出,在向磁盘输出时效率更高。<br>
</span></p>
<p class="style2"> <strong>11-3 使用I/O流以文本方式建立一个文件test1.txt,写入字符“已成功写入文件!”,用其它字处理程序(例如windows的记事本程序Notepad)打开,看看是否正确写入。</strong><br>
</span></p>
<p class="style2"> 解: <br>
  #include &lt;fstream.h&gt; </span></p>
<p class=g style2>void main() <br>
  {<br>
  ofstream file1("test.txt");<br>
  file1 &lt;&lt; "已成功写入文件!";<br>
  file1.close();<br>
  }</p>
<p class=g style2>程序运行后test1.txt的内容为:已成功写入文件!<br>
</p>
<p class=g style2><strong>11-4 使用I/O流以文本方式打开上一题建立的文件test1.txt,读出其内容显示出来,看看是否正确。</strong><br>
</p>
<p class=g style2>解: <br>
  #include &lt;fstream.h&gt;</p>
<p class=g style2>void main() <br>
  {<br>
  char ch;<br>
  ifstream file2("test.txt");<br>
  while (file2.get(ch))<br>
  cout &lt;&lt; ch;<br>
  file2.close();<br>
  }</p>
<p class=g style2>程序运行输出:<br>
  已成功写入文件!<br>
</p>
<p class=g style2><strong>11-5 使用I/O流以文本方式打开上题建立的文件test1.txt,在次此文件后面添加字符“已成功添加字符!”,然后读出整个文件的内容显示出来,看看是否正确。</strong><br>
</p>
<p class=g style2>解: <br>
  #include &lt;fstream.h&gt;</p>
<p class=g style2>void main() <br>
  {<br>
  ofstream file1("test.txt",ios::app);<br>
  file1 &lt;&lt; "已成功添加字符!";<br>
  file1.close ();<br>
  char ch;<br>
  ifstream file2("test.txt");<br>
  while (file2.get(ch))<br>
  cout &lt;&lt; ch;<br>
  file2.close();</p>
<p class=g style2>}</p>
<p class=g style2>程序运行输出:<br>
  已成功写入文件!已成功添加字符!<br>
</p>
<p class=g style2><strong>11-6 定义一个dog类,包含体重和年龄两个成员变量及相应的成员函数,声明一个实例dog1,体重为5,年龄为10,使用I/O流把dog1的状态写入磁盘文件,再声明另一个实例dog2,通过读文件把dog1的状态赋给dog2。分别使用文本方式和二进制方式操作文件,看看结果有何不同;再看看磁盘文件的ASCII码有何不同。</strong><br>
</p>
<p class=g style2>解: <br>
  以两种方式操作,程序运行结果一样,但磁盘文件的ASCII码不同,使用二进制方式时,磁盘文件的ASCII码为05 00 00 00 0A 00 00 00,使用文本方式时,磁盘文件的ASCII码为05 00 00 00 0D 0A 00 00 00,这是因为此时系统自动把0A转换为了0D 0A。<br>
  #include &lt;fstream.h&gt;</p>
<p class=g style2>class dog<br>
  {<br>
  public:<br>
  dog(int weight, long days):itsWeight(weight),<br>
  itsNumberDaysAlive(days){}<br>
  ~dog(){}<br>
  <br>
  int GetWeight()const { return itsWeight; }<br>
  void SetWeight(int weight) { itsWeight = weight; }<br>
  <br>
  long GetDaysAlive()const { return itsNumberDaysAlive; }<br>
  void SetDaysAlive(long days) { itsNumberDaysAlive = days; }<br>
  <br>
  private:<br>
  int itsWeight;<br>
  long itsNumberDaysAlive;<br>
  };</p>
<p class=g style2>int main() // returns 1 on error<br>
  {<br>
  char fileName[80];<br>
  <br>
  cout &lt;&lt; "Please enter the file name: ";<br>
  cin &gt;&gt; fileName;<br>
  ofstream fout(fileName);<br>
  // ofstream fout(fileName,ios::binary);<br>
  if (!fout)<br>
  {<br>
  cout &lt;&lt; "Unable to open " &lt;&lt; fileName &lt;&lt; " for writing.\n";<br>
  return(1);<br>
  }<br>
  <br>
  dog Dog1(5,10);<br>
  fout.write((char*) &amp;Dog1,sizeof Dog1);<br>
  <br>
  fout.close();</p>
<p class=g style2>ifstream fin(fileName);<br>
  // ifstream fin(fileName,ios::binary);<br>
  if (!fin)<br>
  {<br>
  cout &lt;&lt; "Unable to open " &lt;&lt; fileName &lt;&lt; " for reading.\n";<br>
  return(1);<br>
  }<br>
  <br>
  dog Dog2(2,2);<br>
  <br>
  cout &lt;&lt; "Dog2 weight: " &lt;&lt; Dog2.GetWeight() &lt;&lt; endl;<br>
  cout &lt;&lt; "Dog2 days: " &lt;&lt; Dog2.GetDaysAlive() &lt;&lt; endl;<br>
  <br>
  fin.read((char*) &amp;Dog2, sizeof Dog2);<br>
  <br>
  cout &lt;&lt; "Dog2 weight: " &lt;&lt; Dog2.GetWeight() &lt;&lt; endl;<br>
  cout &lt;&lt; "Dog2 days: " &lt;&lt; Dog2.GetDaysAlive() &lt;&lt; endl;<br>
  fin.close();<br>
  return 0;<br>
  }</p>
<p class=g style2>程序运行输出:<br>
  Please enter the file name: a<br>
  Dog2 weight: 2<br>
  Dog2 days: 2<br>
  Dog2 weight: 5<br>
  Dog2 days: 10<br>
</p>
<p class=g style2><strong>11-7 观察下面的程序,说明每条语句的作用,看看程序执行的结果。<br>
  #include &lt;iostream&gt;<br>
  using namespace ::std;</strong></p>
<p class=g style2><strong>void main()<br>
  {<br>
  ios_base::fmtflags original_flags = cout.flags(); //1 <br>
  cout&lt;&lt; 812&lt;&lt;'|';<br>
  cout.setf(ios_base::left,ios_base::adjustfield); //2<br>
  cout.width(10); //3<br>
  cout&lt;&lt; 813 &lt;&lt; 815 &lt;&lt; '\n';<br>
  cout.unsetf(ios_base::adjustfield); //4<br>
  cout.precision(2);<br>
  cout.setf(ios_base::uppercase|ios_base::scientific); //5<br>
  cout &lt;&lt; 831.0 ;<br>
  <br>
  cout.flags(original_flags); //6<br>
  }</strong><br>
</p>
<p class=g style2>解: <br>
  //1保存现在的格式化参数设置,以便将来恢复这些设置;<br>
  //2 把对齐方式由缺省的右对齐改为左对齐;<br>
  //3 把输出域的宽度由缺省值0改为10;<br>
  //4 清除对齐方式的设置;<br>
  //5 更改浮点数的显示设置;<br>
  //6 恢复原来的格式化参数设置。</p>
<p class=g style2>程序运行输出:<br>
  812|813 815<br>
  8.31E+02<br>
</p>
<p class=g style2><strong>11-8 提示用户输入一个十进制整数,分别用十进制、八进制和十六进制形式输出。</strong><br>
</p>
<p class=g style2>解: <br>
  #include &lt;iostream.h&gt;</p>
<p class=g style2>void main() {<br>
  int n;<br>
  cout &lt;&lt; "请输入一个十进制整数:";<br>
  cin &gt;&gt; n;<br>
  cout &lt;&lt; "这个数的十进制形式为:" &lt;&lt; dec &lt;&lt; n &lt;&lt; endl;<br>
  cout &lt;&lt; "这个数的八进制形式为:" &lt;&lt; oct &lt;&lt; n &lt;&lt; endl;<br>
  cout &lt;&lt; "这个数的十六进制形式为:" &lt;&lt; hex &lt;&lt; n &lt;&lt; endl;<br>
  } </p>
<p 
      class=g style2>程序运行输出:<br>
  请输入一个十进制整数:15<br>
  这个数的十进制形式为:15<br>
  这个数的八进制形式为:17<br>
  这个数的十六进制形式为:f<br>
</p>
<p class=g style2><strong>11-9 编写程序实现如下功能:打开指定的一个文本文件,在每一行前加行号。</strong><br>
</p>
<p class=g style2>解: <br>
  //b.cpp<br>
  #include &lt;fstream.h&gt;<br>
  #include &lt;strstrea.h&gt;<br>
  #include &lt;stdlib.h&gt;</p>
<p class=g style2>void main(int argc, char* argv[])<br>
  {<br>
  <br>
  strstream textfile;<br>
  {<br>
  ifstream in(argv[1]);<br>
  textfile &lt;&lt; in.rdbuf();<br>
  }<br>
  ofstream out(argv[1]); <br>
  <br>
  const int bsz = 100;<br>
  char buf[bsz];<br>
  int line = 0;<br>
  while(textfile.getline(buf, bsz)) {<br>
  out.setf(ios::right, ios::adjustfield);<br>
  out.width(1);<br>
  out &lt;&lt; ++line &lt;&lt; ". " &lt;&lt; buf &lt;&lt; endl;<br>
  }<br>
  }</p>
<p class=g style2>编译后运行程序b text1.txt<br>
  运行前text1.txt的内容为:<br>
  aaaaaaaaaaaa<br>
  bbbbbbbbbbbb<br>
  cccccccccccc<br>
  dddddddddddd<br>
  eeeeeeeeeeee<br>
  ffffffffffff<br>
  gggggggggggg<br>
  hhhhhhhhhhhh</p>
<p class=g style2>运行后text1.txt的内容为:<br>
  1. aaaaaaaaaaaa<br>
  2. bbbbbbbbbbbb<br>
  3. cccccccccccc<br>
  4. dddddddddddd<br>
  5. eeeeeeeeeeee<br>
  6. ffffffffffff<br>
  7. gggggggggggg<br>
  8. hhhhhhhhhhhh</p>
<p class="style2">&nbsp;</p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -