承接上一讲。

2.7文件I/O

关于读写文件,C++中有一个专门的头文件<fstream>。

首先是读文件演示样例,例如以下:

</pre><pre>

/*************************************************************************
> File Name: list1301_file.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月22日 星期四 22时15分11秒
************************************************************************/ #include<cstdio>
#include<iostream>
#include<fstream>
#include<string> using namespace std; int main()
{
ifstream in ("list1301.txt");
if (not in )
{
perror("list1301.txt");
}
else
{
string x;
while(in >> x)
{
cout << x << endl;
}
in.close();
}
return 0;
}

文件内容:

读操作结果:

然后是写文件,示比例如以下:

/*************************************************************************
> File Name: list1302_write.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月24日 星期六 12时24分23秒
> Aim at:Copying Integers from a Named File to a Named File
************************************************************************/ #include <cstdio>
#include <fstream>
#include <iostream> using namespace std; int main()
{
// Read data from file in
ifstream in("data.txt");
if (not in)
perror("data.txt"); // 文件不存在
else
{
ofstream out("out.txt"); // Write the data to out
if (not out)
perror("out.txt"); // 文件不存在
else
{
int x(0);
while (in >> x)
out << x << '\n';
out.close();
in.close(); // 关闭文件流
}
}
return 0;
}

文件内容例如以下:





执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

只是上面的读写文件存在一定的问题。就是程序没有检查输出操作是否成功运行,以下的程序的改造就是带有最小错误检查的演示样例:

/*************************************************************************
> File Name: list1302_write_check.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月24日 星期六 12时58分50秒
************************************************************************/ #include<iostream>
#include<string>
#include<fstream>
#include<cstdio>
using namespace std;
int main()
{
// read data from in
ifstream in("data.txt");
if(not in)
perror("data.txt");
else
{
ofstream out("out.txt");
if(not out)
perror("out.txt");
else
{
int x(0);
while(in >> x)
out << x<< endl;
out.close();
if(not out)
{
perror("ou.txt");
}
}
}
return 0;
}

就是这一部分:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

2.8数据结构——映射

前面我们已经介绍并学习了C++的一个特有的数据结构——向量。如今我要介绍另外一个C++的特有数据结构——映射,其它的高级语言成称之为字典等,事实上都一样就是键值对的映射罢了。当中键是唯一的。值不限。

以下是一个演示样例:

/*************************************************************************
> File Name: list1401_data.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月24日 星期六 13时17分39秒
************************************************************************/ // 读取单词并统计出现的次数
#include<cstdio>
#include<iomanip>
#include<ios>
#include<iostream>
#include<fstream>
#include<string>
#include<map> using namespace std;
int main()
{
map<string, int> counts;
string word; fstream in("data.txt");
if(not in)
{
perror("data.txt");
}
// Read words from the standard input and count the number of times
// each word occurs.
cout << "Read words from data.txt, spreate by blank space" << endl;
// For each word/count pair...
ofstream out("out.txt");
if(not out)
{
perror("out.txt");
}
while(in >> word)
{
++counts[word];
out << word << endl;
}
// out.close();
in.close();
cout << "The words and count are:" << endl;
out << "The words and count are:" << endl;
for (map<string,int>::iterator iter(counts.begin()); iter != counts.end(); ++iter)
{
// Print the word, tab, the count, newline.
cout << iter->first << '\t' << iter->second << '\n';
out << iter->first << '\t' << iter->second << '\n';
}
out.close();
if(not out)
{
perror("out.txt");
}
return 0;
}

数据文件依旧上面那个,结果例如以下:

下面一个演示样例是利用迭代器循环格式化输出映射内容:

/*************************************************************************
> File Name: list1401_data_compat.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月24日 星期六 14时58分34秒
************************************************************************/ #include <iomanip>
#include <ios>
#include <iostream>
#include <map>
#include<fstream>
#include <string> // Aligning Words and Counts Neatly using namespace std; int main()
{
map<string, int> counts;
string word;
// read data from data.txt
fstream in("data.txt");
if(not in)
{
perror("data.txt");
} cout << "Read words from data.txt, spreate by blank space" << endl;
ofstream out("out.txt");
if(not out)
{
perror("out.txt");
}
// write data to out.txt
out << "Begin !!!! Hahahahahahahhaha" << endl;
while(in >> word)
{
++counts[word];
out << word << endl;
} // Determine the longest word.
string::size_type longest(0);
for (map<string,int>::iterator iter(counts.begin()); iter != counts.end(); ++iter)
if (iter->first.size() > longest)
longest = iter->first.size(); // For each word/count pair...
const int count_size(10); // Number of places for printing the count
out << "Hahahahahahahhaha!!!!" << endl;
for (map<string,int>::iterator iter(counts.begin()); iter != counts.end(); ++iter)
{
// Print the word, count, newline. Keep the columns neatly aligned.
cout << setw(longest) << left << iter->first <<
setw(count_size) << right << iter->second << '\n'; out << setw(longest) << left << iter->first <<
setw(count_size) << right << iter->second << '\n';
}
return 0;
}

文件内容:

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

以下一个样例是搜索映射中的指定键:

/*************************************************************************
> File Name: list1401_data_serach.cpp
> Author: suool
> Mail: 1020935219@qq.com
> Created Time: 2014年05月24日 星期六 15时17分30秒
************************************************************************/ #include<cstdio>
#include<fstream>
#include<iomanip>
#include<iostream>
#include<string>
#include<map> using namespace std;
int main()
{
map<string, int> counts;
string word; // read data from data.txt
ifstream in ("word.txt");
if(not in)
{
perror("word.txt");
}
// write data to out.txt
ofstream out ("out.txt");
if(not out)
{
perror("out.txt");
}
out << "Begin !!!! Hahahhahahah!!! \n";
while(in >> word)
{
++counts[word];
out << word << '\n';
}
out.close(); map<string, int>::iterator the(counts.find("the"));
if(the == counts.end())
cout << "\"the\" is not found!!!!" << endl;
else if(the->second == 1)
cout << "\"the\" occurs " << the->second << " time\n";
else
cout << "\"the\" occurs " << the->second << " times\n"; return 0;
}

文件内容:

执行结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Vvb2w=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

未完待续。

。。。。。

。。

最新文章

  1. 在webapi2中使用OWIN 自寄宿模式
  2. WeakReference
  3. 如何通过命令行创建和设置一个MySQL用户
  4. Dynamics AX 2012 R2 耗尽用户
  5. EasyUI-标签(Tabs)用法
  6. 解决mac eclipse 异常退出后无法打开处于loading状态
  7. 自定义鼠标Cursor转变成图片
  8. 网页加速特技之 AMP
  9. 20145237 《Java程序设计》第九周学习总结
  10. Python中使用hashlib进行加密的简单使用
  11. noip2017&quot;退役&quot;记
  12. Matplotlib Toolkits:地图绘制工具
  13. python_code list_1
  14. 对Tomcat 8.0进行JVM层面的优化(基于Oracle JDK 8)
  15. 【深入Java虚拟机】之一:Java内存模型
  16. css小知识 2
  17. eosio.cdt:EOS智能合约工具集
  18. poj3579 二分套二分
  19. Nginx 日志分析命令
  20. 剑指offer六十一之序列化二叉树(待补充)

热门文章

  1. Oracle 用户管理(一)
  2. Oracle新建Schema
  3. ActiveX插件
  4. db file sequential read等待事件 --转载
  5. NOIp2018之前打模板出现的问题汇总
  6. 双系统下Ubuntu安装教程
  7. java8 Lambad表达式自己的例子
  8. 【原创】java的反射机制
  9. SQL基本语句:1.模式 3.索引
  10. day21 模块