C++ I/O流技术
C++流类库与C的I/O操作优势比较,文件与流
http://blog.163.com/zhoumhan_0351/blog/static/399542272010030103055465
1、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打开模式说明
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),作为重载操作符">>""<<"的操作对象,用输入输出数据的方式进行流格式的设置和复位。
#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();
} ///:~
hopegrace 发布了127 篇原创文章 · 获赞 23 · 访问量 9023 私信 关注