文件输入-读取-输出

fstream



一、读取并输出

问题描述:格式转换,从一个文件中读取日期07/21/2016,转换为以下格式July 21,2016并输出到屏幕上

#include<iostream>
#include<fstream>
using namespace std;
struct Date{
	int day;
	int month;
	int year;
};
//格式转换,从一个文件中读取日期07/21/2016,转换为以下格式July 21,2016并输出到屏幕上
//https://blog.csdn.net/qq_32925781/article/details/79423803
//错误:写文件用二进制write,读文件都是用文本 >> 方式,这样输入输出有问题。
//正确:一般文本方式写入用<<,读用>>。二进制写入用write,读取用read。不能混。

int main(){
	//方法一: 
	Date dat;
	ofstream file("date1.txt");
	cin>>dat.day>>dat.month>>dat.year;//cin按照空格区分 
	file<<dat.day<<" "<<dat.month<<" "<<dat.year<<endl;		
	file.close();
	//!!!!以空格读入 ,因为cin以空格输入,若分行,则读取多次 
	ifstream file1("date1.txt");
	Date dat1;
	file1>>dat1.day>>dat1.month>>dat1.year;
	//验证数字:cout<<dat1.day<<":"<<dat1.month<<":"<<dat1.year<<endl; 
	switch(dat1.month){
		case(7):cout<<"July ";break;
	}
	cout<<dat1.day<<","<<dat1.year;
	file1.close();
	return 0;
	
	/*
	//方法二 :输入输出正确,但write与read针对二进制,在文件中会有乱码 
	Date d;
	ofstream os("date2.txt",ios_base::out|ios_base::binary);
	cin>>d.day>>d.month>>d.year;
	os.write(reinterpret_cast<char*>(&d),sizeof(Date));
	os.close();
	
	ifstream is("date2.txt",ios_base::in|ios_base::binary);
	Date d1;
	if(is){
		is.read(reinterpret_cast<char*>(&d1),sizeof(Date));
		cout<<d1.day<<":"<<d1.month<<":"<<d1.year;
	}else{
		cout<<"Error";
	}

	return 0;
	*/
}

二、一个文件读一个二进制记录到一个结构中

#include <fstream>
#include <iostream>
using namespace std;
//从一个文件读一个二进制记录到一个结构中

struct Student{
	unsigned id;
	int score;
};
 
//1.用输出流初始化一个 输出流,利用输出流的write将内存中的内容写到流(文件) 
//2.文件不为空,先建立一个临时结构体,从文件(流)中读字节到一个指定的存储器区域 

int main(){
	Student st={2019413944,100};//内存当中 
	ofstream os("st_new",ios_base::out|ios_base::binary);
	os.write(reinterpret_cast<char *>(&st),sizeof(st));//拿着数据写到流 
	os.close();
	
	ifstream is("st_new",ios_base::in|ios_base::binary);
	if(is){
		Student st1;
		is.read(reinterpret_cast<char *>(&st1),sizeof(st1));//将流中的数据写到内存 
		cout<<st1.id<<" :"<<st1.score;		
	}else{
		cout<<"Error";
	}
	is.close();
	return 0;
}

三、随机生成十个数并转成字符串输出到文件

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <sstream>
using namespace std;

//数值转换为字符串 

string toString(int &x){
	ostringstream os;
	os<<x;
	return os.str();
}
int main(){
	
	srand(time(0));
	int a[10]={0};
	ofstream os("pay.txt",ios_base::out);	
	
	for(int i=1;i<=10;i++){
		a[i]=rand()%(100000-10)+10;	
		cout<<a[i]<<" ";
		os<<toString(a[i])<<endl;
		
		
	    //os.write(reinterpret_cast<char *>(&a[i]),sizeof(a[i]));
		
	}
	os.close();
	
	
	/*
	ifstream is("pay.txt",ios_base::in|ios_base::binary);
	char *p;
	if(is){
		for(int i=0;i<10;i++){
			is.read(p,sizeof(p));
			cout<<*p;
			p++;
		}
		//is.read()
		
	
	}*/
	return 0;
}

四、标准实例

#include<iostream>
#include<fstream>
using namespace std;
struct student
{
	int num;
	int age;
	int score;
};
int main()
{
	student stu;
	
	ofstream file("student.txt");
	cin>>stu.num>>stu.age>>stu.score;
	file<<stu.num<<" "<<stu.age<<" "<<stu.score<<endl;		
	file.close();
	
	ifstream file1("student.txt");
	student stu1;
	file1>>stu1.num>>stu1.age>>stu1.score;
	cout<<stu1.num<<"/ "<<stu1.age<<" /"<<stu1.score<<endl; 
	file1.close();
	return 0;
}


总结

最好是用<< >>,强制类型转换容易报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值