C++ I/O流技术

C++ I/O流技术    

    C++流类库与C的I/O操作优势比较,文件与流

http://blog.163.com/zhoumhan_0351/blog/static/399542272010030103055465

1、I/O流类

C++ I/O流技术

1)最底层的basic_streambuf,具有基本的缓存处理功能。

template <class E, class T = char_traits<E> >

    class basic_streambuf 

其它模板类都是它的友元类,以利用它的底层读写功能进行操作。

2)ios_base提供基本的读写格式设置,读写状态和错误检测功能。

static const fmtflags boolalpha, dec, fixed, hex, internal,

        left, oct, right, scientific, showbase, showpoint,

        showpos, skipws, unitbuf, uppercase, adjustfield(一般做对齐方式的屏蔽码),

        basefield(一般做进制输出方式的屏蔽码), floatfield(一般做浮点数输出方式的屏蔽码);

3)basic_ios模板类继承于ios_base非模板类,在ios_base基础上,将字符特性考虑进来,提供基本的字符数据输入输出处理。

4)basic_istream模板

template <class E, class T = char_traits<E> >

    class basic_istream : virtual public basic_ios<E, T> 

    C++通过具现以上I/O流的模板类,提供了便于应用的单字节和多字节的I/O流类,包括单字节的流类ios,istream,ostream,ifstream,ofstream,fstream等,及多字节的流类wios,wistream,wostream等。

typedef basic_istream<char, char_traits<char> > istream;

typedef basic_ostream<char, char_traits<char> > ostream;

......

2、标准输入输出流

    单字节处理的流对象cin,cout,cerr,clog,和双字节处理的流对象wcin,wcout,wcerr,wclog等。

extern istream cin;

extern ostream cout;

3、文件输入输出

typedef basic_ifstream<char, char_traits<char> > ifstream;

1)打开open函数

fstream::open

void open( const char* filename, int openMode, int nProt = filebuf::openprot );

openmode打开模式说明

C++ I/O流技术

2)文件关闭close

3)读写

文本方式在读写过程中会对字符进行转换或删除某些字符,如空格,适用于有一定数据格式的文件读取。二进制方式则按字节进行读写,不作任何转换,读取的数据不会丢失。

用"<<"">>"进行读写。

ostream& put( char& ch );

istream& get( char& ch );

ostream& write( const char* pch, int nCount );

istream& read( char* pch, int nCount );

istream& getline( char* pch, int nCount, char delim = '\n' );

#include <fstream>

#include <iostream>

using namespace std; 

struct Student{

 char name[8];

 int year;

};

int main(void){

 Student st,st1;

 strcpy(st.name,"宋公明"); 

 st.year=18;

 ofstream wFileStream;

 wFileStream.open("C:\\student.txt", ios::out);

 if(!wFileStream){

  cout << "打开文件失败" << endl;

  return 1;

 }

 wFileStream.write(reinterpret_cast<char*>(&st), sizeof(Student));

 cout<<"sizeof(Student)"<<sizeof(Student)<<endl;

 cout<<"sizeof(char*)"<<sizeof(char*)<<endl;

 wFileStream.close();

 ifstream rFileStream;

 rFileStream.open("C:\\student.txt", ios::in);

 rFileStream.read(reinterpret_cast<char*>(&st1), sizeof(Student));

 cout << st1.name << "  " << st1.year << endl;

 rFileStream.seekg(0,ios::end);

 int filesize=rFileStream.tellg();//可以得出文件大小

 cout<<"FileSize is:"<<filesize<<endl;

 rFileStream.close();

 return 0;

}

随机读写:

istream& seekg( streamoff off, ios::seek_dir dir );

basic_istream& seekg(pos_type pos);//get pointer

basic_istream& seekg(off_type off, ios_base::seek_dir way);

++++++++++++++++++++++++++++

basic_ostream& seekp(pos_type pos);

basic_ostream& seekp(off_type off, ios_base::seek_dir way);

ostream& seekp( streampos pos );//put pointer

ostream& seekp( streamoff off, ios::seek_dir dir );

来移动文件读写指针,索引值从0开始。

pos_type tellg();

ostream tellg();

+++++++++++++++++

pos_type tellp();

istream tellp();

可分别来获取当前文件指针的读位置和写位置指针。

ios::clear//状态位复位,在遇到错误后继续处理。

4)流的格式控制

用函数设置

long setf( long lFlags );

long setf( long lFlags, long lMask );

lMask是隐码。组成隐码格式的所有格式首先被复位,只有这部分格式可重新设置,再用第一个参数设置新格式。

long unsetf( long lFlags );

#include <iostream>

using namespace std;

int main(void){

 cout.setf(ios::scientific | ios::uppercase);

 cout << 2006.5 << endl;

 //cout.setf(ios::floatfield,ios::fixed | ios::showpos);

 //cout << 2006.5 << endl;  

 cout.setf(ios::showpos);

 cout << 2006.5 << endl;

 return 0;  

}

输入输出流(一)

http://blog.163.com/zhoumhan_0351/blog/static/39954227201002945157577

用重载的">>""<<"操作符设置

将各种setf/unsetf函数的格式设置处理,用对象方式(函数对象)封装起来,成为流格式控制对象(manipulator),作为重载操作符">>""<<"的操作对象,用输入输出数据的方式进行流格式的设置和复位。

C++ I/O流技术

#include <iostream>

#include <iomanip>

using namespace std;

int main(void){

 cout << setw(20) << "hello" << endl; 

 cout << setprecision(4) << 2006.526 << endl;

 cout << setw(20) << setfill('*') << "baby" << endl;

 cout << scientific << 300.89 << endl;

 cout << oct << 9 << endl;

 cout << dec << showpos << 172 << endl;

 cout << noshowpos << 172 << endl;

 cout << boolalpha << true << endl;

 return 0;

}

利用文件技术给文本加行号:

#include <vector>

#include <string>

#include <fstream>

#include <iostream>

#include <cmath>

using namespace std;

int main() {

  ifstream in("C:\\MyText.txt");

  ofstream out("C:\\MarkedByNum.txt");

  string line;

  vector<string> lines;

  while(getline(in, line)) // Read in entire file

lines.push_back(line);

  if(lines.size() == 0) return 0;

  int num = 0;

  // Number of lines in file determines width:

  //const int width = int(log10((double)lines.size())) + 1;

  for(int i = 0; i < lines.size(); i++) {

    out.setf(ios::left, ios::adjustfield);

//out.width(width);

out << ++num << ") " << lines[i] << endl;

  }

   in.close();

   out.close();

} ///:~

 

 

 

C++ I/O流技术C++ I/O流技术 hopegrace 发布了127 篇原创文章 · 获赞 23 · 访问量 9023 私信 关注
上一篇:Python学习笔记018


下一篇:c – 吃了EOF后重复使用std :: cin