IO与流

1
2
3
4
5
ssize_t
__libc_read (int fd, void *buf, size_t nbytes)
{
return SYSCALL_CANCEL (read, fd, buf, nbytes);
}

文件属于IO中的重要环节,本文将针对使用C++对文件处理的过程进行总结。

简介

在介绍文件相关的类库前,我们先来看一下C++中关于IO的类库之间的相关关系

uProf界面

从这张图中可以看出,基于最基础的IOS类,C++标准库中又延伸出了一系列的关于IO的库,包括iostream(标准输入输出流)、fstream(文件流)、sstream(string流),这些库一同构成了C++的输入输出系统。

标准IO流

基本类库介绍

常用API

getline

getline是istream中非常常用的一个API,其功能是从istream中向string读取一行,该函数声明如下:

1
2
istream& getline (istream& is, string& str, char delim);   //以delim流作为分隔符,仅支持单个分隔符
istream& getline (istream& is, string& str); //以'\n'作为流分隔符

string流

基本类型介绍

类名 功能
istringstream 输入string流,从string中读取数据
ostringstream 输出string流,向string中输出数据
sstringstream 同时具有ofstream和ifstream的功能,可以创建文件,并从文件中读写信息

常用API

常用操作

文件流

基本类型介绍

类名 功能
ofstream 输出文件流,创建文件并向文件写入信息,流向为$文本 \rightarrow 文件$
ifstream 输入文件流,从文件中读取信息
fstream 同时具有ofstream和ifstream的功能,可以创建文件,并从文件中读写信息

常用操作

文本单词数统计

这里的单词是广义的单词,即凡是以空格或回车进行分割的都称之为单词,这个统计结果与word的结果是一致的,如果需要仅统计26个英文单词,那么可以进行单独的判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int wordCount(const string& file){
ifstream ifs;
ifs.open(file);
string sentence, word;
int count = 0;
if(ifs.is_open()){
while ( getline (ifs,sentence) ){ //从 ifstream --> string
istringstream sentence_stream(sentence); // 从string --> istringstream
while(sentence_stream >> word) //从 istringstream --> string
count++;
}
ifs.close();
}
else{
cout << "Unable to open the file" << endl;
}
return count;
}

应用实例:词频分析器

条件与限制

  • 应当仅以. ? ! ;四个标点符号作为对句子进行划分
  • 单词是指仅包含26个大小写英文字母的以空格进行区分的字符串

模块

文件处理模块

单句划分模块

词频统计模块

接口

工作流程

1
// 读取文件

参考文献

0%