《实用C++》第44课 文件IO操作之读写

本文转载自:VC驿站

https://www.cctry.com/thread-290075-1-1.html

1、简介:
上节课给大家介绍了各种类型的文件流对象,对文件进行了打开与关闭的操作。那么打开与关闭不是目的,打开文件之后重要的是为了要进行文件的读写操作,不然打开、关闭文件干嘛?对不对?在C++文件流操作中,可以使用多种方法对文件进行读写操作,例如:<<、>>、put、get、getline、read、write 都是可以的。接下来就分别给大家讲解下每个函数怎么用!

2、文件的写操作:
写操作对应的有:<<、put、write 等,我们来看下他们分别都能实现什么样的写文件功能!
①、写文本类型/ASCII码类型的可见字符串:<<、put
示例代码如下:

#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
    short var = 20000;
    ofstream fs;
    fs.open("d:\\123.txt");
    if (!fs) return 0;

    fs << var << endl;
    fs << "真的是你吗?" << endl;
    fs.put('Y');
    fs.close();
    return 0;
}

大家看到了吧,这就是写文本文件的方式,其中 << 支持的类型比较多,put 只能写单个字符到文件,还是有一定局限性的,所以 put 平时用的比较少。
<< 支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3C%3C/

②、二进制类型写文件:write
并不一定所有的文件都是文本文件,也并不是所有的功能都要求用文本文件来实现。例如:图片文件就是二进制文件,我们用记事本打开之后发现里面是乱码,根本不是我们用眼睛能看懂的文本文件,所以类似这样的文件就不能用 << 或者 put 来写入了。那么用什么呢?可以用接下来要给大家讲解的 write 函数,他支持文本类型和二进制类型。你只要告诉他内存的地址,以及从这个地址开始要写多少字节的数据到文件就可以了,例如:

#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
    short var = 20000;
    ofstream fs;
    fs.open("d:\\123.txt");
    if (!fs) return 0;

    fs.write((char*)&var, sizeof(var));
    fs.close();
    return 0;
}


这里面大家可以看到 write 的第一个参数是 char* 类型的,但是不要误以为 write 只能写字符串类型的数据,完全错误!char * 不一定是字符串,里面放的东西可能是字符串,也可能是二进制数据。其实对于 write 来说第一个参数如果写成 void* 可能大家能更好理解一些。也就是一个地址而已,具体这个地址里面的内容是什么,write 不关心。第二个参数就是要一个长度,要从多长的一块内存数据写到文件中。大家明白了吗?

3、文件的读操作:
①、读文本类型/ASCII码类型的文件:>>、get、getline

#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
    short var = 20000;
    ofstream fs_out;
    fs_out.open("d:\\123.txt");
    if (!fs_out) return 0;
    fs_out << var << endl;
    fs_out.close();

    var = 3000;

    ifstream fs_in;
    fs_in.open("d:\\123.txt");
    if (!fs_in) return 0;
    fs_in >> var;
    char ch = fs_in.get();
    fs_in.close();
    return 0;
}

>>支持的类型详见:http://www.cplusplus.com/referen ... eam/operator%3E%3E/
istream::get 详见:http://www.cplusplus.com/reference/istream/istream/get/

还有一个 getline 函数,该函数是从文件中读取一行数据,什么是一行?所谓的一行就是有换行符 \n,或者达到 getline 的缓冲区大小,或者读到文件末尾。
istream::getline 详见:http://www.cplusplus.com/reference/istream/istream/getline/
所以,如果是想把文件中的内容一行一行的读进来,可以使用 getline 函数,还是非常方便的。
#include <fstream>

using namespace std;
int main(int argc, char* argv[])
{
    short var = 20000;
    ofstream fs_out;
    fs_out.open("d:\\123.txt");
    if (!fs_out) return 0;
    fs_out << var << endl;
    fs_out << var + 1 << endl;
    fs_out << var + 2 << endl;
    fs_out.close();

    ifstream fs_in;
    fs_in.open("d:\\123.txt");
    if (!fs_in) return 0;

    char sz[10] = { 0 };
    fs_in.getline(sz, 10);
    fs_in.getline(sz, 10);
    fs_in.getline(sz, 10);
    fs_in.close();
    return 0;
}


②、读取二进制文件类型:read

#include <fstream>
using namespace std;
int main(int argc, char* argv[])
{
    short var = 20000;
    ofstream fs_out;
    fs_out.open("d:\\123.txt");
    if (!fs_out) return 0;
    fs_out << var << endl;
    fs_out << var + 1 << endl;
    fs_out << var + 2 << endl;
    fs_out.close();

    ifstream fs_in;
    fs_in.open("d:\\123.txt");
    if (!fs_in) return 0;

    char sz[100] = { 0 };
    fs_in.read(sz, 100);
    fs_in.close();
    return 0;
}

具体 read 函数的定义见:http://www.cplusplus.com/reference/istream/istream/read/
也就是说他从指定的文件中读取数据,读取的数据可以是文本类型的也可以是二进制类型的,其实read也不管你想要读取什么东西,我只管读就是了,把读取到的内容放在第一个参数指针指向的内存中,具体读取的字节数就是靠第二个参数指定。

4、小作业:
今天给大家讲解了如何进行文件的读写,介绍了相关的读写文件的函数,那么今天给大家留的小作业就是如何判断读写文件的操作/函数是否成功了呢?以及如何判断是否读到文件末尾了呢?希望大家课后自己实践下!

第44课视频教程下载地址:

https://www.cctry.com/thread-290075-1-1.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值