感觉书里面对流的介绍非常的玄学,今天上网查了一下,做个笔记
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间。所谓output的意思可以理解为内存输出数据到其他设备
(例如硬盘或者显示器),而input可以理解为其他设备输出数据到内存。stream(流)就是这个数据交换的过程。在输入和输出的过程中,因
为不同设备之间有很大的速度差异,因此肯定要建立buffer(缓冲区),buffer是一块内存。
在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:
1、插入器(<<)
向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<”Write Stdout”<<’\n’;就表示把字符串”Write Stdout”和换行字符(‘\n’)输出到标准输出流。
2、析取器(>>)
从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。
iostream类有一个子类叫fstream,是用来处理文件对象的(file-stream)。下面介绍一点fstream类的用法。仅仅把我最近用到的记下来,慢慢更新,不会面面俱到!
std::getline()函数
下面是std::getline()的声明,存在于string.h中。
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
从上面的声明可以看到,getline()返回值是isteam&,有三个参数。
第一个参数 istream& is 是一个输入流,将该输入流中的第一行数据输入第二个参数 string& str 中。第三个参数是换行标识符,默认是回车。你也可以通过显式输入第三个参数,来重载换行符。
•功能:
–从输入流中读入字符,存到string变量
–直到出现以下情况为止:
•读入了文件结束标志
•读到一个新行
•达到字符串的最大长度
–如果getline没有读入字符,将返回false,可用于判断文件是否结束
下面是一个getline()的小例子
//读取某个文本文档,用getline()把文档中的每一行读取下来并加入一个vector,把vector中的元素逐个输出
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> words;
string word;
ifstream input("c:\\1.txt"); //文档的内容和路径自己随便弄一个
while(!input.eof()){ //eof(),iostream类的成员函数,判断当前流是否到文件末尾
getline(input,word); //把getline()放在while中也可以。什么也没读入的时候,它返回false。
words.push_back(word);
cout << word << endl;
cout << "test 1" << endl;
if(input.failbit != 0) //读取到文件末尾时,failbit值不为0
{cout << "test" << endl;}
}
for(auto i = words.begin();i != words.end();++i)
{
cout << *i << endl;
}
input.close();
system ("pause");
return 0;
}