c++文件怎么进行读取和写入操作


本文摘自PHP中文网,作者青灯夜游,侵删。

c++文件进行读取和写入操作的方法:1、使用“>>”和“<<”运算符;2、使用“istream::read()”和“ostream::write()”方法;3、使用“istream::get()”和“ostream::put()”成员方法。

本教程操作环境:windows7系统、C++17版本、Dell G3电脑。

方法1:C++ >>和<<读写文本文件

fstream 或者 ifstream 类负责实现对文件的读取,它们内部都对 >> 输出流运算符做了重载;同样,fstream 和 ofstream 类负责实现对文件的写入,它们的内部也都对 << 输出流运算符做了重载。

所以,当 fstream 或者 ifstream 类对象打开文件(通常以 ios::in 作为打开模式)之后,就可以直接借助 >> 输入流运算符,读取文件中存储的字符(或字符串);当 fstream 或者 ofstream 类对象打开文件(通常以 ios::out 作为打开模式)后,可以直接借助 << 输出流运算符向文件中写入字符(或字符串)。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

    int x,sum=0;

    ifstream srcFile("in.txt", ios::in); //以文本模式打开in.txt备读

    if (!srcFile) { //打开失败

        cout << "error opening source file." << endl;

        return 0;

    }

    ofstream destFile("out.txt", ios::out); //以文本模式打开out.txt备写

    if (!destFile) {

        srcFile.close(); //程序结束前不能忘记关闭以前打开过的文件

        cout << "error opening destination file." << endl;

        return 0;

    }

    //可以像用cin那样用ifstream对象

    while (srcFile >> x) {

        sum += x;

        //可以像 cout 那样使用 ofstream 对象

        destFile << x << " ";

    }

    cout << "sum:" << sum << endl;

    destFile.close();

    srcFile.close();

    return 0;

}

执行此程序之前,必须在和该程序源文件同目录中手动创建一个 in.txt 文件,假设其内部存储的字符串为:

1

10 20 30 40 50

建立之后,执行程序,其执行结果为:

1

sum:150

同时在 in.txt 文件同目录下,会生成一个 out.txt 文件,其内部存储的字符和 in.txt 文件完全一样,读者可自行打开文件查看。

通过分析程序的执行结果不难理解,对于 in.txt 文件中的 "10 20 30 40 50" 字符串,srcFile 对象会依次将 "10"、"20"、"30"、"40"、"50" 读取出来,将它们解析成 int 类型的整数 10、20、30、40、50 并赋值给 x,同时完成和 sum 的加和操作。

同样,对于每次从 in.txt 文件读取并解析出的整形 x,destFile 对象都会原封不动地将其再解析成对应的字符串(如整数 10 解析成字符串 "10"),然后和 " " 空格符一起写入 out.txt 文件。

方法2:C++ read()和write()读写二进制文件

C++ ostream::write()方法写文件

ofstream 和 fstream 的 write() 成员方法实际上继承自 ostream 类,其功能是将内存中 buffer 指向的 count 个字节的内容写入文件,基本格式如下:

1

ostream & write(char* buffer, int count);

其中,buffer 用于指定要写入文件的二进制数据的起始位置;count 用于指定写入字节的个数。

也就是说,该方法可以被 ostream 类的 cout 对象调用,常用于向屏幕上输出字符串。同时,它还可以被 ofstream 或者 fstream 对象调用,用于将指定个数的二进制数据写入文件。

同时,该方法会返回一个作用于该函数的引用形式的对象。举个例子,obj.write() 方法的返回值就是对 obj 对象的引用。

需要注意的一点是,write() 成员方法向文件中写入若干字节,可是调用 write() 函数时并没有指定这些字节写入文件中的具体位置。事实上,write() 方法会从文件写指针指向的位置将二进制数据写入。所谓文件写指针,是是 ofstream 或 fstream 对象内部维护的一个变量,文件刚打开时,文件写指针指向的是文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 write() 方法写入 n 个字节,写指针指向的位置就向后移动 n 个字节。

下面的程序演示了如何将学生信息以二进制形式写入文件:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

#include <fstream>

using namespace std;

class CStudent

{

public:

    char szName[20];

    int age;

};

int main()

{

    CStudent s;

    ofstream outFile("students.dat", ios::out | ios::binary);

    while (cin >> s.szName >> s.age)

        outFile.write((char*)&s, sizeof(s));

    outFile.close();

    return 0;

}

输入:

1

2

3

4

Tom 60?L

Jack 80?L

Jane 40?L

^Z?L

其中,?L表示输出换行符,^Z 表示输入Ctrl+Z组合键结束输入。

执行程序后,会自动生成一个 students.dat 文件,其内部存有 72 字节的数据,如果用“记事本”打开此文件,可能看到如下乱码:

1

Tom 烫烫烫烫烫烫烫烫<   Jack 烫烫烫烫烫烫烫?P   Jane 烫烫烫烫烫烫烫?

值得一提的是,程序中第 13 行指定文件的打开模式为 ios::out | ios::binary,即以二进制写模式打开。在 Windows平台中,以二进制模式打开文件是非常有必要的,否则可能出错。

另外,第 15 行将 s 对象写入文件。s 的地址就是要写入文件的内存缓冲区的地址,但是 &s 不是 char * 类型,因此要进行强制类型转换;第 16 行,文件使用完毕一定要关闭,否则程序结束后文件的内容可能不完整。

C++ istream::read()方法读文件

ifstream 和 fstream 的 read() 方法实际上继承自 istream 类,其功能正好和 write() 方法相反,即从文件中读取 count 个字节的数据。该方法的语法格式如下:

1

istream & read(char* buffer, int count);

其中,buffer 用于指定读取字节的起始位置,count 指定读取字节的个数。同样,该方法也会返回一个调用该方法的对象的引用。

和 write() 方法类似,read() 方法从文件读指针指向的位置开始读取若干字节。所谓文件读指针,可以理解为是 ifstream 或 fstream 对象内部维护的一个变量。文件刚打开时,文件读指针指向文件的开头(如果以 ios::app 方式打开,则指向文件末尾),用 read() 方法读取 n 个字节,读指针指向的位置就向后移动 n 个字节。因此,打开一个文件后连续调用 read() 方法,就能将整个文件的内容读取出来。

阅读剩余部分

相关阅读 >>

精选的这19道c/c+面试题,你能答对多少呢? - 个人文章 思否

C++万能头文件是什么?

第五章C++:语句的相关介绍

c语言和C++区别大吗

C++中不能重载的运算符有哪些

C++中的四种强制类型转换_基本用法及使用场景

microsoft C++ 语言扩展:try-except 语句结构化异常

vC++C++之间有什么区别?

C++如何实现字符串分割函数split?(代码示例)

C++ 图解层序遍历和逐层打印智能指针建造的二叉树

更多相关阅读请进入《C++》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...