C++学习之IO流

本博文主要介绍IO流中fstream,iterator的简单应用。

问题描述:

a):找一篇文章(The Bble Holy) ,将其所有的单词输入vector中,并统计其单词个数

b):增加统计词频功能,用结构体实现(word ,count) ,将结构体存入vector中

c):增加体用词功能。

  1):从网上找 英文停用词,并命名为 stop_list.txt;

  2):统计词频时,若遇到此类词直接略过。

d):计算上述话费时间,具体有:

  1):读取文件时间;

  2):排序所用时间;

  3):打印多用时间。

代码如下:

  1 #include <iostream>
  2 #include <string>
  3 #include <vector>
  4 #include <stdio.h>
  5 #include <stdlib.h>
  6 #include <string.h>
  7 #include <algorithm>
  8 #include <fstream>
  9 #include <ctype.h>
 10 #include <sys/time.h>
 11 #include <stdexcept>
 12 using namespace std ;
 13
 14 struct Word
 15 {
 16     string word_ ;
 17     int count_ ;
 18 };
 19 //readfile to vec
 20 void ReadFile(ifstream &in, vector<Word> &vec, const vector<string>&stop );
 21 //readstoplist to stop
 22 void ReadStopList( ifstream& in , vector<string> &stop);
 23 //judge s is a stopword or not
 24 bool IsStopWord(const vector<string>&stop , const string s );
 25 //treans s to lower one
 26 void stringToLower(string&s);
 27 //judge s include punct or not
 28 void ErasePunct(string &s);
 29 //judge vec include s or not & add word to vec
 30 void AddWordToDict(vector<Word> &vec ,const string s);
 31 //sort word by frequency
 32 void WordSort(vector<Word> &vec );
 33 //print frequency of a word
 34 void printFrequency( const vector<Word>&vec ) ;
 35 //calculate runing_time
 36 int64_t getTime();
 37 int main(int argc, const char *argv[])
 38 {
 39     // readfile -->store  to vec --->sort ---> calculate count ---> print
 40     if(argc < 2)
 41     {
 42         perror("Usage:exe srcfile");
 43         exit(EXIT_FAILURE);
 44     }
 45     vector<Word> vec ;
 46
 47     vector<string> stopList ;
 48
 49     ifstream infile(argv[1]);
 50     ifstream stopfile("stop_list.txt");
 51     if( ! stopfile )
 52         throw std::runtime_error("stop_list does not exist!");
 53     if( !infile )
 54         throw std::runtime_error("open file failure");
 55
 56     int64_t starttime = getTime();
 57     ReadStopList(stopfile , stopList);
 58     ReadFile( infile, vec ,stopList );
 59     int64_t readtime = getTime();
 60
 61     WordSort( vec );
 62
 63     int64_t sorttime = getTime();
 64     printFrequency( vec ) ;
 65
 66     int printtime = getTime();
 67     cout << vec.size() << endl ;
 68     cout << "the time of reading file :" << (readtime - starttime) << endl ;
 69     cout << "the time of  sorting: "  << (sorttime - readtime) << endl ;
 70     cout<<"the time of printing"<< (printtime - sorttime) << endl ;
 71     infile.close();
 72     return 0;
 73 }
 74
 75 //dos2unix command : window-->unix  //将windows文档格式转化成unix文档格式
 76 void ReadFile(ifstream &in,
 77               vector<Word> &vec,
 78               const vector<string>&stop )
 79 {
 80     vec.clear();
 81     string s ;
 82     while( in >> s)
 83     {
 84         ErasePunct(s); // judge s dose include punct or not
 85         stringToLower(s);
 86         if(! IsStopWord(stop ,s))
 87        {
 88            AddWordToDict(vec , s);
 89        }
 90     }
 91 }
 92
 93 void ReadStopList( ifstream& in , vector<string> &stop)
 94 {
 95     stop.clear();
 96     string s ;
 97     while( in >> s)
 98     {
 99        stop.push_back( s );
100     }
101 }
102 void stringToLower(string &s)
103 {
104     string::iterator it =s.begin();
105     while(it != s.end())
106     {
107         if(isupper(*it))
108             *it = tolower(*it);
109         it++ ;
110     }
111 }
112
113
114 bool IsStopWord(const vector<string>&stop , const string s )
115 {
116     vector<string>::const_iterator it = stop.begin();
117     while( it != stop.end())
118     {
119         if((*it) == s)
120         {
121             return true ;
122         }
123         it ++ ;
124     }
125     if(it == stop.end())
126         return false ;
127    //还可以用find函数 ,代码如下
128    /*
129         vector<string>::const_iterator it =
130         find(stop.begin(), stop.end(), s );
131     return (it != stop.end());
132
133         */
134 }
135
136 void ErasePunct(string &s)
137 {
138     string::iterator it = s.begin();
139     while(it != s.end())
140     {
141         if(ispunct(*it))
142             it = s.erase(it);
143         else
144             ++it ;
145     }
146 }
147
148 void AddWordToDict(vector<Word> &vec ,const string s)
149 {
150     vector<Word>::iterator it = vec.begin();////顺序查找
151        while( it != vec.end())
152     {
153         if(it->word_ == s)
154         {
155             (it->count_) ++ ;
156             break ;
157         }
158         ++ it ;
159     }
160     if(it == vec.end()) // 类似于链表操作
161     {
162         Word tmp ;
163         tmp.word_ = s ;
164         tmp.count_ = 1 ;
165         vec.push_back(tmp);
166     }
167 }
168
169 int tmp(const Word &w1 , const Word &w2)
170 {
171     // a > b
172     return (w1.count_ > w2.count_);
173 }
174 void WordSort(vector<Word> &vec )
175 {
176     sort(vec.begin() , vec.end() ,tmp ); //库函数sort
177 }
178
179 void printFrequency( const vector<Word>&vec )
180 {
181     for(vector<Word>::const_iterator it = vec.begin(); //注意此处的const
182         it != vec.end();
183         ++ it)
184      printf("word :%s, frequency: %d\n", it->word_.c_str(), it->count_);
185 int64_t getTime();
186 }
187
188
189 int64_t getTime()
190 {
191     struct timeval tm ;
192     memset(&tm , 0, sizeof(tm));
193     if(-1== gettimeofday(&tm ,NULL))
194         throw runtime_error("gettime failure");
195
196     int64_t  t =  tm.tv_usec ;
197     t += tm.tv_sec*1000*1000 ;
198     return t ;
199 }

本程序时间复杂度为O(n*n),虾片文章我们将讨论时间复杂度更优的算法。

时间: 2024-10-04 09:59:27

C++学习之IO流的相关文章

Java学习日记-----IO流

1.java.io包下 File类:java程序中的此类的一个对象,就对应着一个文件或网络中的一个资源. Flie file1 = new File("D:\\io\\hello.txt"); File file2 = new File("D:\\IO\\io1"); >1. File既可以表示一个文件也可以表示一个文件目录 >2.   File的对象是与平台无关的 >3. File类针对于文件或文件目录,只能进行新建.删除.重命名.上层目录等等操

Java学习之IO流

转载链接:https://blog.csdn.net/zhaoyanjun6/article/details/54292148 Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作. IO流的分类 根据处理数据类型的不同分为:字符流和字节流 根据数据流向不同分为:输入流和输出流 字符流和字节流 字符流的由来: 因为数据编码的不同,而有了

Java学习之IO流四

1.用代码实现以下需求 (1)定义学生类,包含姓名(String name),性别(String gender),年龄(int age)三个属性,生成空参有参构造,set和get方法,toString方法 (2)键盘录入6个学员信息(录入格式:张三,男,25),要求有两个相同的信息,将6个学员信息存入到ArrayList集合中 (3)将存有6个学员信息的ArrayList集合对象写入到D:\\StudentInfo.txt文件中 (4)读取D:\\StudentInfo.txt文件中的Array

Java学习日记-----IO流 练习

分别使用字节流和字符流完成以下程序: 1. 在指定的路径下新建一个 .txt 文件 "test.txt",利用程序在文件中写入如下内容: "Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于个人PC.数据中心.游戏控制台.科学超级计算机.移动电

Java学习之IO流三

1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中(高效流) 1 /** 2 * 1.从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中 3 * @author vanguard 4 * 5 */ 6 public class Demo01 { 7 public static void main(String[] args) { 8 //键盘输入两个文件夹路径 9 Scanner sc = new Scanner(System.in); 1

Java学习之IO流一

01. IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作 * c: IO操作 * 把上面的这种输入和输出动作称为IO操作 02. File类的概述和作用 * A:File类的概述和作用 * a: File的概念 * File类是文件和目录路径名的抽象表示形式 * Java中把文件或者目录(文件夹)都封装成File对象 * 我们要去操作硬盘

Java学习之IO流总结

---恢复内容开始--- 流是用来读写数据的,java有一个类叫File,它封装的是文件的文件名,只是内存里面的一个对象,真正的文件是在硬盘上的一块区间,在这个文件里面存放着各种各样的数据,我们想读文件里面的数据怎么办?是通过一个流的方式来读的,咋恩要想从程序读数据,对于计算机来说,无论读什么类型的数据都是以01010101010101这样的形式读取的,怎么把文件里面的数据读取出来呢?你可以把文件想象成一个小桶,文件就是一个桶, 文件里面的数据就相当于是这个桶里面的水,那么我们怎么从这个桶里面取

java学习笔记--IO流

第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存在,如果存在,则返回true delete() : 删除文件,如果删除成功,则返回true deleteOnExit() : 程序退出的时候才删除文件 二.创建文件夹 exists() : 判断文件夹是否存在,如果存在,则返回true delete() : 删除文件夹,如果删除成功,则返回true

Java学习之IO流(转换流)

转换流:就是对字节流和字符流之间转换的流对象 InputStreamReader:字节流到字符流的桥梁.解码 OutputStreamWriter:字符流到字节流的桥梁.编码 1 private static void readKey3() throws IOException { 2 // 字节流 3 InputStream in = System.in; 4 5 // 字节流转成字符流.解码 6 Reader r = new InputStreamReader(in); 7 // 字符流 8