Cookbook系列之Cpp:数据流与文件
问题01:如何垂直排列文本输出,使其左对齐或右对齐
使用标准的流操作符来设置字段的宽度和对齐方式。一个操作符就是操作在流上的函数,通过操作符<<将这些操作函数应用到流上。
#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ios_base::fmtflagsflags=cout.flags();intwidth=10;cout<<left<<setw(width)<<"Jim"<<setw(width)<<"Tom"<<setw(width)<<"Bill"<<endl;cout<<right<<setfill('.')<<setw(width)<<"Jim"<<setw(width)<<"Tom"<<setw(width)<<"Bill"<<endl;return0;}
//outputJimTomBill.......Jim.......Tom......Bill
问题02:如何格式化输出浮点数
使用<iomanip>和<ios>提供的标准操作来控制写入流中的浮点数的格式。
#include<iostream>#include<iomanip>#include<ios>usingnamespacestd;intmain(){ios_base::fmtflagsflags=cout.flags();doublepi=3.14159265;cout<<setprecision(5)<<pi<<endl;cout<<fixed<<showpos<<setprecision(3)<<pi<<endl;cout<<scientific<<noshowpos<<pi<<endl;cout.flags(flags);return0;}
//output3.1416+3.1423.142e+00
问题03:如何复制文件
使用<fstream>中的C++文件流来把数据从一个流复制到另一个流。打开文件的方式在类ios中定义,常用的值如下:
>> ios::app:以追加的方式打开文件
>> ios::ate:文件打开后定位到文件尾,ios:app就包含有此属性
>> ios::binary:以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
>> ios::in:文件以输入方式打开
>> ios::out:文件以输出方式打开
>> ios::nocreate:不建立文件,所以文件不存在时打开失败
>> ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
>> ios::trunc:如果文件存在,把文件长度设为0
#include<fstream>usingnamespacestd;intmain(){fstreamin("/root/.bashrc",ios::binary|ios::in);fstreamout("/tmp/bashrc",ios::binary|ios::out);out<<in.rdbuf();in.close();out.close();return0;}
问题04:如何删除或重命名文件,并且这些操作是可移植的
使用定义在<cstdio>中的标准C函数remove和rename。如果操作失败,函数将返回非零值,并设置errno。你可以使用strerror来将错误信息输出到cerr流中。
问题05:如何创建临时文件
有两种办法可以用来创建一个临时文件。声明在<cstdio>中的tmpfile函数不带任何参数,并且成功后返回一个FILE*指针,不成功返回一个NULL。你可以使用C的输入输出函数fread、fwrite、fgets、fputs等来操作它。tmpfile使用"wb+"的方式打开文件,并在程序退出后,自动删除该文件。
如果你需要一个具名的临时文件,那么tmpnam可以满足你的要求。tmpnam事实上不会产生一个临时文件,它只是创建一个唯一的文件名,你可以用这个文件名来打开一个文件。tmpnam带一个char*类型的参数并返回一个char*类型的值。你可以使用一个指向一个字符缓存的指针来传递它,但必须至少有L_tmpnam内存,tmpnam将复制这个临时的名字,并且返回一个指向这个缓存的指针。如果你传递一个NULL值的话,tmpfile将返回一个指向一个包含文件名的静态缓存指针,也就意味着随后的tmpnam调用将会改写它。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。