笔记十 常用IO操作

1 使用istream_iterator和ostream_iterator

copy( istream_iterator< int >( cin ),istream_iterator< int >(),ostream_iterator< int >( cout ));

a)将infile中的字符串输出到标准输出
istream_iterator< string > ins( infile ), eos;
ostream_iterator< string > outs( cout, " " );
copy( ins, eos, outs );

b)将infile中的字符串输出到标准容器vector
vector<string> text;
// Ok: 提供 iterator 对
istream_iterator< string > is_string( infile ), end_of_stream;
copy( is_string, end_of_stream,inserter( text, text.begin() ));

2 输入 (cin>>)
缺省情况下,所有的空白字符都被抛弃掉。如果我们希望读入空白字符,或许是为了保留原始的输入格式,或许是为了处理空白字

符,一种方法是使用istream的get()成员函数。

char ch;
while(cin.get(ch))
{
cout.put(ch);//输出所有字符,包括空白字符
}

3 字符串输入
a)以C风格字符串形式读入
char inbuf[1024];
while(cin>>inbuf)
{
char *str=new char[strlen(inbuf)+1];
strcpy(str,inbuf);
/*...........*/
delete []str;
}

b)读入string类型
string str;
while(cin>>str)

#include<iomanip>
setw()
while(cin>>setw(bufsize)>>buf)

这里bufSize 是字符数组buf 的长度。setw()把长度等于或大于bufSize 的字符串分成最大长度为
bufSize - 1
的两个或多个字符串。在每个新串的末尾放一个空字符。

5 过滤string中的特定元素

string filt_elems( "\",?.");
string::size_type pos = 0;
while (( pos = str.find_first_of( filt_elems, pos ))!= string::npos )
str.erase( pos, 1 );

6 get()一次读入一个字节
  getline()一次读入一块字节

get()的三种形式:

a) get(char &ch) 从输入流中提取一个字符,包括空白字符,并将它存储在ch中。它返回被应用的istream对象。

b) get()从输入流读入一个字符。它返回该字符值而不是被应用的istream对象。返回的对象int而不是char。

c) get(char *sink, streamsize size, char delimiter='\n')

sink代表一个字符数组,用来存放被读取到的字符。size代表可以从istream中读入的字符的最大数目。delimiter表示,如果遇到

它就结束读取字符的动作。delimiter字符本身不会被读入,而是保留在istream中,作为istream的下一个字符。

7 ignore( streamsize length = 1, int delim = traits::eof )
ignore()从istream 中读入并丢弃length 个字符,或者遇到delimiter 之前包含delimiter在内的所有字符,或者直到文件结尾。


8 istream 成员函数gcount()正好提供了这样的信息,它返回由最后的get()或getline()调用实际提取的字符数。

write( const char *sink, streamsize length )

read( char* addr, streamsize size )

getline( istream &is, string str, char delimiter );

// 将字符放回 iostream
putback( char c );
// 往回重置下一个 istream 项
unget();
// 返回下一个字符或 EOF
// 但不要提取出来
peek();

char ch, next, lookahead;
while ( cin.get( ch ))
{
switch (ch) {
case '/':
// 是注释行吗? 用 peek() 看一看:
// 是的? ignore() 余下的行
next = cin.peek();
if ( next == '/' )
cin.ignore( lineSize, '\n' );
break;
case '>':
// 查找 >>=
next = cin.peek();
if ( next == '>' ) {
lookahead = cin.get();
next = cin.peek();
if ( next != '=' )
cin.putback( lookahead );
}
// ...
}

9 文件输入和输出
#include <fstream>

ofstream outfile( "copy.out", ios_base::out );
传递给ofstream 构造函数的实参分别指定了要打开的文件名和打开模式。
ofstream 文件
可以被打开为输出模式(ios_base::out) 或附加模式(ios_base::app)

在缺省情况下,ostream文件以输出模式打开。

在这两种模式下如果文件不存在程序都会创建一个新文件。

fstream类对象可以打开一个被用于输出或输入的文件,fstream类从iostream类派生而来。

file.open( "word.out", ios_base::in );
file.open( "word.out", ios_base::app );// ios_base::out 将丢弃当前的数据

fstream类对象还可以打开一个同时被用于输入和输出的文件。
fstream io( "word.out", ios_base::in|ios_base::app );


10 seekg() seekp()
g表示为了获取字符而定位
p表示为了设置字符而定位
这些函数移动到文件中的一个“绝对”地址,或者从特定位置移动一个偏移。

// 设置到文件中固定的位置上
seekg( pos_type current_position );
// 从当前位置向某个方向进行偏移
seekg( off_type offset_position, ios_base::seekdir dir );

在第一个版本中,当前位置被设置为由current_position 指定的某个固定的位置,这里0是文件的开始。

第二种形式使用一个偏移来重新定位文件,该偏移值或者是从当前位置开始计算,或者是到文件开始处的偏移,或者是从文件尾部倒退向后计算这由第二个实参来指定。dir可以被设置为以下选项:
ios_base::beg 文件的开始
ios_base::cur 文件的当前位置
ios_base::end 文件的结尾


ios_base::pos_type mark = onfile.tellp();

如果程序员希望从文件的当前位置向前移动一个Record

readFile.seekg( sizeof(Record), ios_base::cur );

你可能感兴趣的:(IO)