c语⾔中fstream⽤法,C++流操作之fstream⽤法介绍
在Windows平台对⽂件进⾏存取操作可选的⽅案有很多,如果采⽤纯C,则需要⽤到File*等,当然也可以直接调⽤WindowsAPI来做;如果采⽤C++,⾸先想到的就是⽂件流fstream。虽然在COM层⾯上,我们还可以使⽤IStream来实现⽂件的读写,其效率也⾮常⾼。不过本⽂仅对C++流操作做简单的探讨,相⽐于WindowsAPI或IStream,C++的流操作通⽤性更好⼀些,因为你能轻松将代码移植到其它平台上。
fstream有两个派⽣类,即ifstream和ofstream,分别对应输⼊⽂件流、输出⽂件流。在使⽤它们之前,必须将它们的头⽂件包含到你的cpp⽂件中。
创建⼀个⽂件流的⽅法很简单:
ifstreamfin;
fin.open("C:\");
这样就创建了⼀个输⼊⽂件流fin,它对应的⽂件是C盘根⽬录下的。实际上,open⽅法还包含⼀个参数mode,⽤以指定其打开⽅式。
ios::in以读取⽅式打开⽂件
ios::out以写⼊⽅式打开⽂件
ios::ate存取指针在⽂件末尾
ios::app写⼊时采⽤追加⽅式
ios::trunc写⼊时抹去旧数据
ios::binary以⼆进制⽅式存取
上⾯的代码并未指定任何打开⽅式,则采⽤默认参数:输⼊⽂件流即ios::in,输出⽂件流即ios::out。⼀般在需要组合特殊的mode才显式指定,⽐如:
ios::in|ios::binary;//以⼆进制⽅式读取⽂件
除此之外,还可以在构造时指定相应的⽂件路径和名称,让创建过程⼀步到位。上述代码可改写为:
ifstreamfin("C:\");
与open⽅法相反的是close⽅法,它的作⽤与open正好相反。open是将⽂件流对象与外设中的⽂件关联起来,close则是解除⼆者的关联。但是需要注意的是,close还起到清空缓存的作⽤。最好让open
⽅法与close⽅法成对出现。
创建并打开⼀个⽂件流后,就能像操作标准I/O那样使⽤流插⼊操作符(<>)。对于输⼊⽂件流来说,可以调⽤getline函数从⽂件流中读取⼀整⾏数据,这样就可以读⼊含有空格的字符串。
下⾯是⼀个例⼦,该例的作⽤是读取⼀个STLA格式的⽂件。STL是⼀种常⽤快速成像⽂件格式,其格式⾮常简单,特别是ASCII版本(即STLA)。代码如下所⽰:
stdafx.h
代码如下:
//stdafx.h:includefileforstandardsystemincludefiles,
//orprojectspecificincludefilesthatareusedfrequently,but
//arechangedinfrequently
//
#pragmaonce
#include"targetver.h"
#include
#include
//added
#include
#include
#include
#include
#include
usingnamespacestd;
//TODO:referenceadditionalheadersyourprogramrequireshere readstla.cpp
/
/readstla.cpp:Definestheentrypointfortheconsoleapplication. //
#include"stdafx.h"
structfacet{
floatnormal[3];
floatvertex[3][3];
};
int_tmain(intargc,_TCHAR*argv[])
{
if(argc<2){
printf("specifyaninputfile!\n");
return1;
}
ifstreamin(argv[1]);
if(!in.is_open()){
printf("failtoopenfile!\n");
return1;
}
//var
vectorsolid;
stringline;
stringword;
//checkformat
getline(in,line);&nbs
p;
if(line.find("solid")!=0){
printf("wrongfileformat!\n");
in.close();
return1;
}
while(getline(in,line)){
if(line.find("facetnormal")!=string::npos){ facetf;
//readnormal
stringstreamns(line);
c语言struct用法例子
ns>>word;//eat"facet"
ns>>word;//eat"normal"
ns>&al[0]>&al[1]>&al[2];
//readvertices
getline(in,line);//"outerloop"
for(inti=0;i<3;i++){
getline(in,line);
stringstreamvs(line);
vs>>word;//eat"vertex"
vs>>f.vertex[i][0]>>f.vertex[i][1]>>f.vertex[i][2]; }
getline(in,line);//"endloop"
getline(in,line);//"endfacet"
solid.push_back(f);
}
}
in.close();
//output
intcnt=solid.size();
printf("read%dfacet\n",cnt);
for(inti=0;i
facet&f=solid[i];
printf("\nfacet%d:\nnormal=(%f,%f,%f)\n",\ i+al[0],f.normal[1],f.normal[2]);
for(intj=0;j<3;j++){
printf("vertex[%d]=(%f,%f,%f)\n",\
j+1,f.vertex[j][0],f.vertex[j][1],f.vertex[j][2]); }
}
return0;
}
测试⽂件为:
cube_corner.stl
代码如下:
solidcube_corner
facetnormal0.0-1.00.0
outerloop
vertex0.00.00.0
vertex1.00.00.0
vertex0.00.01.0
endloop
endfacet
facetnormal0.00.0-1.0
outerloop
vertex0.00.00.0
vertex0.01.00.0
 
;
vertex1.00.00.0
endloop
endfacet
facetnormal0.00.0-1.0
outerloop
vertex0.00.00.0
vertex0.00.01.0
vertex0.01.00.0
endloop
endfacet
facetnormal0.5770.5770.577
outerloop
vertex1.00.00.0
vertex0.01.00.0
vertex0.00.01.0
endloop
endfacet
endsolid
输⼊结果为:
read4facet
facet1:
normal=(0.000000,-1.000000,0.000000)
vertex[1]=(0.000000,0.000000,0.000000)
vertex[2]=(1.000000,0.000000,0.000000)
vertex[3]=(0.000000,0.000000,1.000000)
facet2:
normal=(0.000000,0.000000,-1.000000)
vertex[1]=(0.000000,0.000000,0.000000)
vertex[2]=(0.000000,1.000000,0.000000)
vertex[3]=(1.000000,0.000000,0.000000)
facet3:
normal=(0.000000,0.000000,-1.000000)
vertex[1]=(0.000000,0.000000,0.000000)
vertex[2]=(0.000000,0.000000,1.000000)
vertex[3]=(0.000000,1.000000,0.000000)
facet4:
normal=(0.577000,0.577000,0.577000)
vertex[1]=(1.000000,0.000000,0.000000)
vertex[2]=(0.000000,1.000000,0.000000)
vertex[3]=(0.000000,0.000000,1.000000)
<
您可能感兴趣的⽂章:C++ofstream与ifstream详细⽤法C++中关于[]静态数组和new分配的动态数组的区别分析C++对数组的引⽤实例分析C/C++中获取数组长度的⽅法⽰例C++普通函数指针与成员函数指针实例解析C++动态数组类的封装实例C++中new与delete、malloc 与free应⽤分析C++命名空间实例解析C++模板特例化应⽤实例C++中fstream,ifstream及ofstream⽤法浅析

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。