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;
}
总结
最好是用<< >>,强制类型转换容易报错