C++ I/O流

得意时要看淡,失意时要看开。不论得意失意,切莫大意;不论成功失败,切莫止步。志得意满时,需要的是淡然,给自己留一条退路;失意落魄时,需要的是泰然,给自己觅一条出路C++ I/O流,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

转载

I/O系统的任务就是在内存和外部设备之间稳定可靠地传输数据和解释数据。

流类库

  1. streambuf提供对缓冲区的低级操作,ios提供流的高级I/O操作
  2. ios派生了两个类,输入流类istream和输出流类ostream
基类 派生类 功能
streambuf filebuf 提供文件缓冲区的管理
strstreambuf 使用字符串保存字符序列,提供在内存中提取和插入操作的缓冲区管理
stdiobuf 提供标准I/O文件的缓冲区管理
istream ifstream 文件输入流类,用于对文件的提取操作
istrstream 字符串输入流类,用于对字符串的提取操作
istream_withassign 重载了赋值运算符的输入流类,标准输入流cin是该类的对象
ostream ofstream 文件输出流类
ostrstream 输出流类
ostream_withassign 重载了赋值运算符的输出流类,标准输出流cout、cerr(非缓冲错误输出流)、clog(缓冲错误输出流)是该类对象

标准流

名称 含义 连向位置
cin 标准输入流 默认连向键盘
cout 标准输出流 默认连向显示器
cerr 标准错误输出流 连向显示器
clog 标准错误输出流 连向打印机

输入流操作

函数 功能
read 无格式输入指定字节数
get 从流中提取字符,包括空格
getline 从流中提取一行字符
ignore 提取并丢弃流中指定字符
peek 返回流中下一个字符,但不从流中删除
gcount 统计最后输入的字符个数
eatwhite 忽略前导空格
seekg 移动输入流指针
tellg 返回输入流中指定位置的指针值
operator>> 提取运算符
#inclued <iostream>
using namespace std;
int main(){
	char c;
	while((c=cin.get()!='\n'))//读取一行
		cout.put(c);
	while(cin.get(c)){//读取一行
		if(c=='\n')	break;
		cout.put(c);
	char s[80];
	cin.get(s,10);//读取9个字符
	cout<<s<<endl;
}

   
   

输出流操作

函数 功能
put 插入一个字节
write 插入一个字节序列
flush 刷新输出流
seekp 移动输出流指针
tellp 返回输出流中指定位置的指针值
operator<< 插入运算符
ofstream outf;
double x=0.618;
outf.write((char*)&x,8);//把变量x的8字节数据写入输出流当前位置

char s[80];
cin.get(s,10);
cout<<write(s,10);

串流

#include<iostream>
#include<sstream>
#include<string>
using namespace std;
int main(){
	string testStr("Input test 256*0.5");
	string s1,s2,s3;
	double x,y;
	istringstream input(testStr);//建立istringstream类对象,与串对象连接
	input>>s1>>s2>>x>>s3>>y;//通过input从testStr中提取数据
	cout<<s1<<s2<<x<<s3<<y;
}

 
 
#include<iostream>
#include<sstream>
using namespace std;
int main(){
	ostringstream Output;
	double x,y;
	cin>>x;
	cin>>y;
	Output<<x<<y;//插入数据项
	cout<<Output.str();
}

 
 

文件处理

三个基本步骤:

  1. 打开文件
  2. 读/写文件
  3. 关闭文件

文件打开

//打开一个已有文件
ifstream infile;//建立输入文件流对象
infile.open("dtafile.dat",ios::in);//连接文件,指定打开方式
//创建一个文件
ofstream outfile;//建立输入文件流对象
outfile.open("d:\\newfile.dat",ios::out);//连接文件,指定打开方式

ifstream infile(“datafile.dat”,ios::in);
ofstream outfile(“d:\newfile.dat”,ios::out)
fstream rwfile(“myfile.dat”,ios::in|ios::out);

文件打开方式

标识常量 意义
ios::in 读方式打开文件
ios::out 写方式打开文件
ios::ate 打开文件时,文件指针指向文件末尾
ios::app 追加方式,将向文件中输出的内容追加到文件尾部
ios::trunc** 删除文件现有内容**
ios::nocreate 如果文件不存在,则打开操作失败
ios::noreplace 如果文件存在,则打开操作失败
ios::binary 二进制代码方式打开,默认为文本方式

关闭文件

关闭文件操作包括:把缓冲区数据完整地写入文件,添加文件结束标志,切断流对象与外部文件的连接。

ifstream infile;
infile.open("file1.txt",ios::in);
infile.close();
infile.open("file2.txt",ios::in);
//若流对象的生存期没有结束,即流对象依然存在,还可以与其他文件连接

 
 

文本文件

创建文件

#include <iostream>
#include <fstream>
using namespace std;
int main(){
	char fileName[30],name[30];
	int number,score;
	ofstream outsbuf;
	cin>>fileName;
	outsbuf.open(fileName,ios::out);//打开文件
	if(!outstuf){
		cerr<<"file could not be open"<<endl;
		abort();
	}
	outstuf<<"This is a file of students\n";//写入文件
	while(cin>>number>>name>>score)
		outstuf<<number<<name<<score<<'\n';
	outstuf.close();//关闭文件

 
 

读文件

#include <iostream>
#include <fstream>
using namespace std;
int main(){
	char name[30],s[80];
	int number,score;
	int n=0,max,min,total=0;
	double ave;
	ifstream instuf("d:\\student.txt",ios:in);
	instuf.seekg(0,ios::beg);//流指针置在文件头
	if(!instuf){
		cout<<"file could not be open."<<endl;
		abort();
	}
	instuf.getline(s,80);//略去标题行
	while(instuf>>number>>name>>score){
		cout<<number<<name<<score;
		if(==0)
			max=min=score;
		else{
			if(score>max) max=score;
			if(score<min) min=score;
		}
		total+=score;
		n++;
	}
	ave=double(total)/n;
	cout<<max<<min<<ave;
	instuf.close();
}

 
 

浏览文件

void browseFile(char *fileName,int delLine){
	ifstream inf(fileName,ios::in);
	char s[80];
	for(int i=1;i<=delLine;i++)//读出开头delLine行不显示
		inf.getline(s,80);
	while(!inf.eof()){//eof为文件结束符
		inf.getline(s,80);
		cout<<s<<endl;
	}
	inf.close();
}

 
 

追加记录

int Append(char *fileName){
	char name[30],ch;
	int number,scorel
	ofstream outstuf(fileName,los::app);
	if(!outstuf){
		cerr<<"file could not be open"<endl;
		return 0;
	}
	cout<<"Do you want to append(Y/N)?"<<endl;
	while(ch=='Y'||ch=='y'){
		cout<<"Input the number,name,and score:\n";
		cin>>number>>name>score;
		outfstuf<<number<<' '<<name<<' '<<score<<' '<<endl;//写入文件
		cout<<"Y/N?";
		cin>>ch;
		if(ch=='N'||ch=='n')
			cout<<"close file.\n";
	}
	outstuf.close();
	return 1;
}

 
 

复制文件

int copyFile(char *destFile,char *srcFile){
	char ch;
	ifstream infile(srcFile,ios::in);
	ofstream outfile(desFile,ios::out);
	if(!infile){
		cerr<<srcFile<<":file could not be open. "<<endl;
		return 0;
	}
	if(!outfile){
		cerr<<desFile<<":file could not be open. "<<endl;
		return 0;
	}
	while(infile.get(ch))//全部字符复制  get()  put()
		outfile.put(ch);
	infile.close();
	outfile.close();
	return 1;
}

 
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/157388.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!