PLM之家精品课程培训,联系电话:18301858168 QQ: 939801026

  • NX二次开培训

    NX二次开培训

    适合初级入门或想深入了解二次开发的工程师,本培训结合ufun,NXOpen C++,大量的实例及官方内部的开发技术对于老鸟也值得借鉴!.

    NX CAM二次开发培训报名 NX二次开发基础培训报名
  • PLM之家Catia CAA二次开发培训

    Catia二次开发培训

    Catia二次开发的市场大,这方面开发人才少,难度大。所以只要你掌握了开发,那么潜力巨大,随着时间的积累,你必将有所用武之地!

  • PLM之Teamcenter最佳学习方案

    Teamcenter培训

    用户应用基础培训,管理员基础培训,管理员高级培训,二次开发培训应有尽有,只要你感兴趣肯学习,专业多年经验大师级打造!

  • PLM之Tecnomatix制造领域培训

    Tecnomatix培训

    想了解制造领域数字化吗?想了解工厂,生产线设计吗?数字化双胞胎,工业4.0吗?我们的课程虚位以待!

PLM之家PLMHome-国产软件践行者

[转载电子书] ifstream 和 ofstream的用法详细介绍

[复制链接]

2014-1-23 14:57:18 4113 0

admin 发表于 2014-1-23 14:57:18 |阅读模式

admin 楼主

2014-1-23 14:57:18

请使用QQ关联注册PLM之家,学习更多关于内容,更多精彩原创视频供你学习!

您需要 登录 才可以下载或查看,没有账号?注册

x
ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;
8 o4 H- I4 w) ^( ~( u( k9 A
' @1 |3 H5 {; t8 A. f9 K% ~  在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的,包括我们要认识的文件I/O,stream这个类有两个重要的运算符:
* }, e& P4 x% X0 U
) g5 _4 O; n% W: C  1、插入器(<<)
. C4 Z+ _, N7 x4 g % p/ E( x/ }3 U2 O  W: y5 \1 A
  向流输出数据。比如说系统有一个默认的标准输出流(cout),一般情况下就是指的显示器,所以,cout<<"Write Stdout"<<'\n';就表示把字符串"Write Stdout"和换行字符('\n')输出到标准输出流。5 `) X- E7 C' ~& C3 T' t% y

$ M' `2 x- k  g% E, o! R  2、析取器(>>)
1 X) B1 ^4 {# I8 w, ~/ ?5 c4 S ! O3 X' x% K$ }! x
  从流中输入数据。比如说系统有一个默认的标准输入流(cin),一般情况下就是指的键盘,所以,cin>>x;就表示从标准输入流中读取一个指定类型(即变量x的类型)的数据。
. v* Q. C+ F* d2 A; l
! J$ e3 o8 o1 y& A  在C++中,对文件的操作是通过stream的子类fstream(file stream)来实现的,所以,要用这种方式操作文件,就必须加入头文件fstream.h。下面就把此类的文件操作过程一一道来。& E% Q4 p% @" ]( T+ \) [

( D: j( d! \. p% z4 d$ y  一、打开文件
6 Y" c& k# A) Q9 [3 R  r# P
; c2 ?6 f( e6 s% I& M' E9 @5 T) E  在fstream类中,有一个成员函数open(),就是用来打开文件的,其原型是:2 L* g( B# }: Z! z5 B& l' r4 C8 c# H
) ]3 j* t* i: q/ E) C8 W: \
  void open(const char* filename,int mode,int access);参数:' K$ M7 P/ G. ]- }/ j3 ]

- ~; |" \# P1 N5 i! D9 s  filename:  要打开的文件名) c' T* s' M  j) m: ^3 v
2 w+ Q9 j0 m# l; d: @
  mode:    要打开文件的方式
" o6 n$ e0 [9 ^! c$ |2 b 9 ?, F- ]" B$ K
  access:   打开文件的属性
- l) |- N9 y5 W# S9 q
) c2 Q6 y% i4 @' v  x  打开文件的方式在类ios(是所有流式I/O类的基类)中定义,常用的值如下:7 y+ R4 K5 r) m% j- g

2 C' M1 d/ w3 v) W+ i  N  ios::app:   以追加的方式打开文件
- B4 z/ y0 p8 ~4 _; n6 n) n
# h4 p4 J& `' u0 c7 \2 \: ]1 F  ios::ate:   文件打开后定位到文件尾,ios:app就包含有此属性0 B4 R$ _: w- q% O7 v) K8 x" K
$ Y; N( V& }8 j* j5 C! o8 L# S
  ios::binary: 以二进制方式打开文件,缺省的方式是文本方式。两种方式的区别见前文
, y9 _$ v# q1 [
7 f7 y9 i3 d& C0 P: L4 Y  ios::in:    文件以输入方式打开(文件数据输入到内存)
0 k, _) h" T! I! N
& v) s* k2 ]9 Y3 S% g" X  ios::out:   文件以输出方式打开(内存数据输出到文件)
( G+ i' @4 W: Z
' N; ~9 t* S* ]2 q# {) ^/ e$ d  ios::nocreate: 不建立文件,所以文件不存在时打开失败2 ?' H# W. x! K4 d  o$ r
4 b4 B) _/ R! c5 D. b6 \; N
  ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败
. Q% X" ?. D! ^4 B " M; I: G, U& F9 f2 `9 }5 d
  ios::trunc:  如果文件存在,把文件长度设为0
7 A- D* w. |5 e, E; g. y
  \% F4 ~- D4 @0 I  可以用“或”把以上属性连接起来,如ios::out|ios::binary
1 F' I, |6 C. g8 _
/ ?. d. S* d4 e  打开文件的属性取值是:
: t! s0 C/ F1 X
9 m! C7 [1 y2 K* k4 ~9 K6 b& G  0:普通文件,打开访问; N, h! E, n; l/ O  U

  h, o7 o9 p. D% Y/ D& Q  1:只读文件
* {% ?, J( T( ?: z & ~( w  f/ T6 W4 y* A- \; R8 A
  2:隐含文件" V% ^" d5 T/ S  g4 C" |
. H  o: F  T! f' M! \" i
  4:系统文件
" v7 R! c! R! N! O
$ b  L! J% Z; v! P  可以用“或”或者“+”把以上属性连接起来,如3或1|2就是以只读和隐含属性打开文件。
2 b! A% C2 ^6 H
8 ^( n" z. g- x* x1 _/ D7 l5 ^  例如:以二进制输入方式打开文件c:\config.sys
- U0 g* q: v2 K4 A3 d! R
8 Y( G7 w; c1 }2 k% I, d+ X9 |* d+ r  fstream file1;5 S4 W/ h1 U: Q, \( _  |" t/ ?8 |
6 r( Q0 s8 u% a1 Z) H" Z+ C
  file1.open("c:\\config.sys",ios::binary|ios::in,0);
/ L0 \3 \2 v% _ 3 @$ c) I7 i7 N  ?" m7 b* I  j
  如果open函数只有文件名一个参数,则是以读/写普通文件打开,即:* \: N1 V$ h, ]) n: M9 r' v

3 U" G# @& w& A! E  file1.open("c:\\config.sys"); <=> file1.open("c:\\config.sys",ios::in|ios::out,0);
- m( Y) y& @) Y9 i$ C' E4 T . s9 T9 A* I( O8 m4 L
  另外,fstream还有和open()一样的构造函数,对于上例,在定义的时侯就可以打开文件了:
: F, F2 @" ~" ~, a
3 ^! u9 U) W. w) U2 e* R) T  fstream file1("c:\\config.sys");  特别提出的是,fstream有两个子类:ifstream(input file stream)和ofstream(outpu file stream),ifstream默认以输入方式打开文件,而ofstream默认以输出方式打开文件。" b9 N- F7 G7 e6 S6 ]+ `  A' s

8 g; S- n" t! |* B  ifstream file2("c:\\pdos.def");//以输入方式打开文件
1 d$ ^7 b0 _! {/ C, V: A: R7 O' S+ } * M+ ]* `& L8 g( f1 G; E8 Q8 m
  ofstream file3("c:\\x.123");//以输出方式打开文件  所以,在实际应用中,根据需要的不同,选择不同的类来定义:如果想以输入方式打开,就用ifstream来定义;如果想以输出方式打开,就用ofstream来定义;如果想以输入/输出方式来打开,就用fstream来定义。
. s2 a9 k( P  J% y
, K8 Z9 x. V# j  二、关闭文件
* i+ o4 P$ Y/ M  Z
; R( Q5 x1 r1 ]/ C# D  打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.close();就把file1相连的文件关闭。
, o$ l2 C! w$ ]9 Q: J
0 d: T6 i1 C% l2 u! u8 B' v6 {  三、读写文件
  Q1 l7 Q  K7 N2 F- g1 ~5 ^% F% G 9 I4 ^! a. D* x' f# q, D/ S& d& G" X
  读写文件分为文本文件和二进制文件的读取,对于文本文件的读取比较简单,用插入器和析取器就可以了;而对于二进制的读取就要复杂些,下要就详细的介绍这两种方式& d2 T. @+ z! m; n

4 j4 y! [: k$ u  1、文本文件的读写
, C- t( ], }9 W
! V8 B( ]2 p' V0 F+ r  文本文件的读写很简单:用插入器(<<)向文件输出;用析取器(>>)从文件输入。假设file1是以输入方式打开,file2以输出打开。示例如下:1 l* i2 r4 ]! N& ^
9 i$ a$ D; }$ {$ r3 S  g/ z$ x+ D
  file2<<"I Love You";//向文件写入字符串"I Love You"
- Q2 T& B# ]' B
5 p0 u: Q9 S' u; R1 \0 y  int i;
) H, l+ S( q- s& G
0 o& p+ x1 {: S9 y  file1>>i;//从文件输入一个整数值。/ {7 R, Y# Y' j2 z/ Z* ~
, ~5 w. O3 k0 p$ w: h
  这种方式还有一种简单的格式化能力,比如可以指定输出为16进制等等,具体的格式有以下一些9 e3 ?% x$ @; \2 I' g% F

  s% x; ~! z, U  操纵符 功能 输入/输出4 m1 c2 X; `  |* Z6 H. c7 g
3 ~8 b% `& a& _8 a
  dec 格式化为十进制数值数据 输入和输出, Z4 J, N6 A& Z; t$ b! N
6 E4 @6 ~* O+ V* u3 b$ d! ^
  endl 输出一个换行符并刷新此流 输出
/ [+ n3 j# {/ x# \6 p& F: @
& O# d9 _. N# t, J" @  ends 输出一个空字符 输出
! ~7 h/ T& e5 R5 P' \' e0 l) [
% r' z$ o  p" M/ |1 d/ F  hex 格式化为十六进制数值数据 输入和输出
0 ^1 p) B8 i" J$ B
- D  t- A/ ^$ ~! H: g& `  oct 格式化为八进制数值数据 输入和输出
' q; `# M5 d, t' h  m $ T7 |# v/ I  j2 n, \
  setpxecision(int p) 设置浮点数的精度位数 输出" ^, o" M  j- R9 |' V8 v

% w& ~$ {+ T+ f9 p4 e0 u  比如要把123当作十六进制输出:file1<
/ ?: d3 o/ ?+ h
  2、二进制文件的读写* A7 g  p  o' F% }) u2 k

- [8 F/ m$ v( u7 _  ①put()
- z+ w: D- x" {! [0 B: w- d1 P
6 ^% d9 y1 Q4 z% Y$ O  put()函数向流写入一个字符,其原型是ofstream &put(char ch),使用也比较简单,如file1.put('c');就是向流写一个字符'c'。
) u/ I9 P  Q/ q- X' W! s
" x3 i+ X5 ~) G7 _/ u  ②get()  C) G! y! C( R
( B6 g  Z, p1 }
  get()函数比较灵活,有3种常用的重载形式:
, |) j+ Y! _* [& D* [+ ~0 X8 Z
5 l: X; Y" w; D; Z2 R  一种就是和put()对应的形式:ifstream &get(char &ch);功能是从流中读取一个字符,结果保存在引用ch中,如果到文件尾,返回空字符。如file2.get(x);表示从文件中读取一个字符,并把读取的字符保存在x中。4 c0 ^1 U) ]5 N  ]
  ]$ W! i, y& e+ |. G
  另一种重载形式的原型是: int get();这种形式是从流中返回一个字符,如果到达文件尾,返回EOF,如x=file2.get();和上例功能是一样的。9 F( O% C, H/ q  u

, U. |3 U3 D% \% l7 i  还有一种形式的原型是:ifstream &get(char *buf,int num,char delim='\n');这种形式把字符读入由 buf 指向的数组,直到读入了 num 个字符或遇到了由 delim 指定的字符,如果没使用 delim 这个参数,将使用缺省值换行符'\n'。例如:
1 |% @8 X/ y* S" Z5 G: X6 G9 I
# R; q4 R. i  O, ~: N0 L  file2.get(str1,127,'A'); //从文件中读取字符到字符串str1,当遇到字符'A'或读取了127个字符时终止。7 V0 s9 O" Y. ^- e/ V- P$ h

5 Q  M* c- V: u" }. {7 Q  ③读写数据块
  u6 n/ X. S* d% Z; U% k
: N; O: C; G# c8 s( i4 ?0 E8 [  要读写二进制数据块,使用成员函数read()和write()成员函数,它们原型如下:
. |7 p/ F8 ?  m. U6 s# c
) f& x" X& z6 E! G! T  read(unsigned char *buf,int num);5 P4 M) V% R# f# `$ a
& B- v( I8 i3 Y
  write(const unsigned char *buf,int num);
' M, J/ \9 E1 ~/ @1 f. E. h. y ) I$ p+ ~9 @) p7 r' B' J
  read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。/ a% [3 v4 W, e) J. K% ]
$ C8 b. l& B$ a# t
  例:
! }5 a9 m" P% p 5 T; B: P8 i9 ]+ q9 k1 A$ L& l
  unsigned char str1[]="I Love You";
7 h- |. [& X) j- [0 M* f ( }2 j. ]; N& Z7 h/ K/ _; g" Y/ h
  int n[5];
: E& l& W7 d: v( @; }0 @ " v+ @" P! A/ v
  ifstream in("xxx.xxx");
" ]# w- n) t# u1 ~
* ~' f0 [8 l% o  ofstream out("yyy.yyy");( _4 N# ]! j+ e+ p, M5 J
1 Z6 T" f' K/ `2 F$ l
  out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中! p: h4 u0 k! B8 E1 @
, @& v* L( s6 B1 I7 k4 K. d
  in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换% {  ^+ v1 c% g; ^7 K
: E+ S- G0 g/ G: k4 B6 f0 V
  in.close();out.close(); 四、检测EOF
3 X/ [; R2 C9 }/ u5 P
/ f4 {3 ?$ M) N9 w; q  成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int eof();  s* E7 A- A2 Q$ V5 |6 x

" f# s+ a+ R6 t- h% J4 N  例:  if(in.eof()) ShowMessage("已经到达文件尾!");* H1 E" x0 b' p; m
0 Q) g) r4 y1 N6 R( \+ q- _( t" v
  五、文件定位
# p  E$ H# E  r! [- s9 V4 x8 ]: Q
4 |5 g) y+ Z! V( ?2 f  和C的文件操作方式不同的是,C++ I/O系统管理两个与一个文件相联系的指针。一个是读指针,它说明输入操作在文件中的位置;另一个是写指针,它下次写操作的位置。每次执行输入或输出时,相应的指针自动变化。所以,C++的文件定位分为读位置和写位置的定位,对应的成员函数是seekg()和seekp()。seekg()是设置读位置, seekp是设置写位置。它们最通用的形式如下:# F# f$ B) x" s% U+ L. E
- W: k3 }  B4 l- s: {  N
  istream &seekg(streamoff offset,seek_dir origin);
2 X' K, o! _8 L  v" a& s1 n
9 T8 \1 z! E+ l: P+ g! L, |  ostream &seekp(streamoff offset,seek_dir origin);
  V; q* t0 s! J3 u" I$ {
3 d, O" R  K( D  streamoff定义于 iostream.h 中,定义有偏移量 offset 所能取得的最大值,seek_dir 表示移动的基准位置,是一个有以下值的枚举:
: @. F3 {* B0 @7 }( [
# {+ w/ c/ r- U8 h  ios::beg:  文件开头
5 x- m4 L$ r+ Q * V" ^, V& }3 h3 |: F
  ios::cur:  文件当前位置7 ^' e- k1 x% Y+ {9 M1 V0 p7 J
5 g1 f  J; ]2 N. }
  ios::end:  文件结尾$ y0 ^* Q& ~5 ^7 I  Z' }& D" X
" x- L6 t- q! F1 A8 b0 a0 _7 G# K
  这两个函数一般用于二进制文件,因为文本文件会因为系统对字符的解释而可能与预想的值不同。例:' L9 m1 E! Z8 v2 F

! f/ c; S: A# ]; f  file1.seekg(1234,ios::cur); //把文件的读指针从当前位置向后移1234个字节( f0 w$ e1 C2 a$ }6 K9 c

- T9 J1 @' q8 o  file2.seekp(1234,ios::beg); //把文件的写指针从文件开头向后移1234个字节
6 I/ {5 c" d0 H: O' \; ^3 P

- x: f- f, K" a" T! t* h2 j+ P; g
上海点团信息科技有限公司,承接UG NX,CATIA,CREO,Solidworks 等CAx软件,Teamcenter,3D Experience等PLM软件,工业4.0数字化软件的实施\二次开发\培训相关业务,详情QQ 939801026 Tel 18301858168 网址 www.diantuankj.com/ doTeam.tech
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 注册

返回列表 本版积分规则

  • 发布新帖

  • 在线客服

  • 微信

  • 客户端

  • 返回顶部

  • x
    温馨提示

    本网站(plmhome.com)为PLM之家工业软件学习官网站

    展示的视频材料全部免费,需要高清和特殊技术支持请联系 QQ: 939801026

    PLM之家NX CAM二次开发专题模块培训报名开始啦

    我知道了