`
jafisher
  • 浏览: 56744 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

文件流操作之C++版

阅读更多
  昨天简单介绍了一下C中的文件流操作,其实更强大、更复杂的操作还得看C++,毕竟C++是C的加强,不论是从功能还是效率上都比C高出一个档次,而我们在实际的流操作中对C++的使用怕也是更加频繁,所以接下来就重点讲解下C++的文件流操作。

  那么就先说说文件流的定义吧。文件流是以外存文件为输入/输出对象的数据流。输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据。每一个文件流都有一个内存缓冲区与之对应。

与C一样,C++的文件流操作也分为同样的三个部分。
(1)打开文件
(2)读/写文件
(3)关闭文件

在这之前先说下文件流的类:
(1) ifstream ifile:只输入用,它是从istream 类派生的。
(2) ofstream ofile:只输出用,它是从ostream 类派生的。
(3) fstream iofile:既输入又输出用,它是从iostream 类派生的。
即是说,如果你想要的操作只是从文件中读数据,可这么定义:
ifstream fin("...");

要写入文件,则是:
ofstream fout("...");

如果既有读操作,又是写操作,就可以直接定义:
fstream fin("...");
fstream fout("...");

好了,知道了这些就可以进行文件的打开操作了。
打开文件有两种方式,一种是自动打开,一种是调用open函数打开。
(1)自动打开:
fstream file("filename",iosmode);

(2)使用open函数打开:
fstream file;
file.open("filename",iosmode);

也可以用指针的形式打开:
fstream* file = new fstream;
file->open("filename",iosmode);

可以注意到,这里的iosmode指的是打开文件的方式,和C一样,C++中的文件流操作中的文件也是分成文本文件和二进制文件,不光是文件,打开方式也有几种类型,下面介绍的这些只是我们平时可能会用到的,当然还有很多类型,只是平时很难会用到,所以就不再介绍了。

ios::in               以输入方式打开文件
ios::out              以输出方式打开文件(默认方式)
ios::app              以追加方式打开文件,数据写到文件尾
ios::ate              打开一个存在文件,文件指针指向文件尾
ios::binary           以二进制方式打开文件
ios::in|ios::out      以输入输出方式打开文件
ios::in|ios::binary   以二进制方式打开一个输入文件
ios::out|ios::binary  以二进制方式打开一个输出文件
ios::binary|ios::app  以二进制方式追加打开一个文件

需要注意的是,一般打开文件的默认方式是打开文本文件,所以二进制文件必须显式打开。
另外,在输出的时候也要注意,默认的输出方式是覆盖之前的数据,所以如果要保存之前的数据的话,一定要记得以追加方式输出啊,我之前就是因为这个问题郁闷了很久~!

关闭文件:
这个和C一样,都是调用close()函数,即file.close();

然后就是我们最为关心的流读写操作了,先介绍一下常用的i/o流成员函数。
1.输入:
(1)get():读取一个字符或一个字符串
这个函数我所不理解的是书上说它有三种形式,不带参数,带一个参数和带三个参数,但我自己在用的时候用的都是不带参数和带两个参数的,貌似都可以。
不带参数的get()是从文件中读取一个字符,而且包括空格,然后返回这个字符。

ifstream fin("test.txt",ios:in);
char ch;
while((ch=fin.get())!=EOF)
  cout.put(ch);

这样就能把test中的字符一个一个读取出来输出屏幕上了,不过它每次只能读一个字符。
带一个参数的get(char* ch,int size)就是读取一段固定长度的字符串。

ifstream fin("test.txt",ios::in);
char ch[100];
fin.get(ch,10);
cout<<ch;

这样就能把test中一段长度为10的字符串读取出来并输出到屏幕上,不过它只能读取固定长度的字符串,如果事先不知道文件中有多大的数据,确实会有点不爽啊。

(2)getline():读取一行字符串
这个函数和get()差不多,在我理解看来是有两种用法,不带参数和带两个参数。

ifstream fin("test.txt",ios::in);
char ch1[100],ch2[100];
ch1 = fin.getline();
cout<<ch1<,endl;
fin.getline(ch2,10);
cout<<ch2<<endl;

这样都是把文件中的一行读取出来并显示到屏幕上,它的不足是不能区分一行中出现的不同类型的字符或整数。当然读整数可以用 fin>>num 的方法把文件中的整数直接读到num中。
其实将get()和getline()结合起来使用是一种不错的选择,如文件中的革一行保存的数据是一个学生的学号,姓名和地址。

ifstream fin("test.txt",ios::in);
int num;
char name[10];
char address[20];
fin>>num;
fin.get(name,10);
fin.getline(address,20);

这样,就把一行中的不同信息都保存起来了。

(3)read():从文件中读取特定字符的字节,这种方式特别适合二进制文件的读取。
如果想要把一个对象保存在文件中,并以对象的方式读取信息,那read()方式真的是太合适了。如想要读取文件中一个学生的信息。

ifstream fin("test.txt",ios::binary);
Student s;
fin.read((char*)&s,sizeof(s));

这样,不管文件中保存的数据有多少不同的类型,抑或根本不知道某一数据的长度,通过这种方式都可以把文件中的某一个学生对象信息保存在s对象中了。这里因为s是自定义数据类型,所以要先把它转化成char* 类型。

2.输出:
输出的方法相对来说要少点,因为输出的过程相对也要简单一点。
(1)put():向文件中写入一个字符。

ofstream fout("test.txt",ios::out);
char ch[6]="hello";
int i=0;
whlie(ch[i]!=EOF)
  put(ch[i++]);

这样就可以把字符串 hello 输出到文件中了,不过它只能将字符一个一个输出,很不方便。

(2)write():向文件写入一定数量的字节,与read()一样,这种方式也特别适合二进制文件的输出。尤其是想要把一个对象保存到文件中时。学生类就不在这里写出来了。

ofstream fout("test.txt",ios::binary);
Student s(1,"jack","1000");
fout.write((char*)&s,sizeof(s));

这样就把学生对象s以二进制的方式保存在文件中了。这里有个问题需要注意,如果只是保存一个对象可能这样写,如果是想保存多条对象,就得稍微改改了。
ofstream fout("test.txt",ios::binary|ios::app);

这样才不会覆盖之前的对象。

当然,其实输出流还有一种更简单的形式,就是用fout直接输出。

int num;
char name[10];
char address[20];
cin>>num>>name>>address;
fout<<num<<name<<address;

如此也可以将数据写入文件中,读取时调用get()或是getline()函数就行了。

除了这些以外,C++中还有一种随机文件的读取,它可以从文件的任意位置随机读取数据。
这里面的两个重要函数就是seekg(n)和tellg()。
seekg(n)可以定位到文件的位置n,从这一点读取或写入数据。
tellg()则是返回当文件的指针值。

写了这么多,我想如果遇到文件流操作的问题,这些应该基本足以解决了吧。当然也希望能与大家分享更多的有关文件流的精髓。

分享到:
评论

相关推荐

    C++ 文件操作大全

    16. tmpfile():生成一个临时文件流。 17. tmpnam():生成一个唯一的文件名。 在文件操作中,需要注意文件的打开模式,包括文本模式和二进制模式。文本模式下,回车被当成一个字符'/n',而二进制模式认为它是两个...

    C++文件读写_c++文件读写_文件操作c++_c++文件读写_

    C++的流操作默认使用缓冲区,这意味着数据不会立即写入或读取文件,而是暂存于内存中,提高效率。当缓冲区满或调用`flush()`时,数据会被写入文件。 总结,C++文件读写涉及的主要知识点包括:文件流的概念,文件的...

    C++流类体系与文件操作

    总的来说,理解和掌握C++的流类体系与文件操作是进行高效、灵活的输入/输出编程的关键。通过流类,我们可以轻松地实现不同媒介之间的数据传输,而文件操作则让程序能够持久化数据,为软件开发提供了极大的便利。

    c++文件操作示例

    4. 关闭文件:完成文件操作后,使用close()函数关闭文件流,释放资源。 接下来,我们详细讨论两种常见的文件操作方法: 1. 使用get()和put()函数: - get()函数用于从流中读取单个字符或一定数量的字符到缓冲区。...

    C++操作系统文件管理系统设计与实现

    3. **I/O流**:文件的读写操作通常通过C++的iostream库实现,如`ifstream`和`ofstream`类,它们提供了对文件进行输入输出的接口。 4. **内存映射文件**:为了提高大文件的读写效率,可以使用内存映射文件技术,将...

    C++文件操作工具类

    3. **文件流管理**:自动打开和关闭文件流,确保资源的有效释放。 4. **错误处理**:在遇到文件操作异常时,提供适当的错误信息,帮助开发者调试。 5. **文件重命名**:方便地更改文件名。 6. **目录操作**:创建、...

    C++文件操作 C++ 文件操作

    ### C++ 文件操作详解 #### 一、C++ 文件处理基础类 在 C++ 中,文件操作主要通过以下几个内置类来进行: 1. **`ofstream`**:用于文件写入(输出),该类由 `ostream` 类派生而来。 2. **`ifstream`**:用于文件...

    C++string常用函数,c++文件流操作,C++中的日期和时间

    在C++编程语言中,字符串处理、文件流操作和日期时间管理是不可或缺的部分。下面将分别详细介绍这些知识点。 首先,让我们关注C++中的`std::string`类,它提供了丰富的函数来处理字符串。一些常用的功能包括: 1. ...

    C++文件流操作

    ### C++ 文件流操作详解 在C++编程中,文件流操作是一项非常重要的技术,它允许程序员读写文件,从而实现数据的持久化存储。本文将深入探讨C++中的文件流操作,包括基本概念、常用类及方法,并通过具体示例进行说明...

    C++ 类 链表 文件流操作

    对于想要提高在链表和文件流操作方面技能的C++初学者,这是一个很好的实践项目。它不仅涵盖了基本的链表操作,还涉及到了如何将这些操作与文件系统接口集成,从而实现数据的持久化。在实际的软件开发中,这样的能力...

    c++ 各种文件操作

    - **文件流(iostream)**:C++ 提供了一种更面向对象的方式来处理文件,即通过 `ifstream` 和 `ofstream` 类来进行输入输出操作。 #### 三、文件的打开与关闭 文件的打开和关闭是文件操作的基础。C++ 提供了几种...

    C++语言的流类体系与文件操作

    ##### 2.2 C++文件流类体系 `fstream`类库中包含了一系列文件流类: - **`fstream`**:从`iostream`派生而来,支持文件的读写。 - **`ifstream`**:从`istream`派生而来,专门用于文件读取。 - **`ofstream`**:从`...

    c++对文件的操作

    在输出流操作结束后,需要关闭文件,例如: ```c fout.close(); ``` 或: ```c fout ; fout.close(); ``` 这将保存文件并关闭它。 输入流的操作: 输入流的操作通过ifstream类来实现。例如: ```c ifstream fin(...

    C C++ C++ Builder的各种文件读写操作总结

    C++ 中的文件读写操作是编程过程中常用的操作之一,C++ Builder 提供了多种方法对文件进行操作。在本节中,我们将对 C++ 中的文件读写操作进行总结。 基于 C 的文件操作 在 ANSI C 中,对文件的操作分为两种方式,...

    C++流常见操作

    本篇将深入探讨C++中的输入输出流、文件流以及字符串流的常见操作。 1. 输入输出流: C++中的输入输出流主要由iostream库提供,主要包括`cin`(标准输入流)和`cout`(标准输出流)。`cin`用于从键盘或其他输入...

    C++标准库中文件流读取操作小结

    ### C++标准库中文件流读取操作小结 在C++编程语言中,文件流是处理文件输入输出的一种常用方式。本文将详细介绍C++标准库中与文件流读取相关的几个重要知识点。 #### 一、`ifstream`类及其基本用法 在C++中,`...

    c++对asc码文件的存取操作

    ifstream和ofstream是C++语言中两个重要的文件流对象,用于文件的输入输出操作。 ifstream对象用于读取文件的内容,例如: ```c ifstream infile("f3.txt", ios::in); ``` ofstream对象用于写入文件的内容,例如...

    C++课件_IO流_二进制文件流操作PPT

    **C++中的IO流与二进制文件流操作** C++是一种强大且灵活的编程语言,其中IO流(Input/Output Stream)系统是处理输入输出的重要组成部分。IO流允许程序与外部设备,如键盘、显示器、文件等进行数据交换。在C++中,...

    C++文件流操作的读与写

    C++文件流操作的读与写,这里是作者初学的一些终结,希望各位海涵啊

    对文件操作C++代码

    在C++中,文件操作是程序设计中一个重要的部分,涉及到数据的持久化...理解文件流的打开模式和具体操作方法对于进行有效的文件操作至关重要。通过实践编写如示例所示的代码,可以加深对C++文件操作机制的理解和掌握。

Global site tag (gtag.js) - Google Analytics