《实用C++》第45课 文件IO操作之文件指针

本文转载自:VC驿站

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

1、文件读写的注意事项:
①、文件读写是否成功?
可以使用 good、bad、fail 来进行判断!
fail() 方法用于判断最后一次读取数据的时候是否遇到了类型不配的情况,若是返回true(如果遇到了EOF,该方法也返回true)
bad() 如果出现意外的问题,如文件受损或硬件故障,最后一次读取数据的时候发生了这样的问题,方法 bad() 将返回true。
good() 该方法在没有发生任何错误的时候返回true。该方法也指出的最后一次读取输入的操作是否成功。

②、读取文件的时候是否已经读到文件末尾?
可以使用 eof 来进行判断!eof() 方法用于判断最后一次读取数据的时候是否遇到EOF,即到达文件末尾,若是则返回true。

#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;
}

2、文件指针:
这里面说的文件指针也可以理解为文件内部记录读取或者写入的当前位置,不然程序如何知道下一次该从文件的什么位置开始读取或者写入呢?
在读写文件的时候,每读取或者写入一个字节,磁盘中的文件指针就会向后移动一个字节。可以通过控制指针的位置,以便在我们需要的位置进行读写文件。

文件流提供以下成员函数来读取或配置文件指针:
tellg()      返回读取文件指针的当前位置
tellp()      返回写入文件指针的当前位置
seekg(指针偏移量)      将读取文件指针移到指定位置
seekg(指针偏移量,参照位置)      将读取文件指针移到指定位置
seekp(指针偏移量)      将写入文件指针移到指定位置
seekp(指针偏移量,参照位置)  将写入文件指针移到指定位置
这些成员函数名和参数,容易混淆,下面就简单解释一下:

备注:以上函数中的最后一个字母不是g就是p,代表什么意思呢?其中,g代表get,表示读取;p代表put,表示写入。
另外,函数参数中的“文件中的位置”和“指针偏移量”为 long整型,以字节为单位。“参照位置”是一个有以下值的枚举:
ios::beg      文件开头计算偏移量
ios::cur       文件当前位置计算偏移量
ios::end      文件结尾计算偏移量
其中,函数seekg(指针偏移量) 和 seekp(指针偏移量),默认从文件开头计算偏移量。
 

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

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

    char ch = fs_in.get();
    long curr = fs_in.tellg();
    fs_in.seekg(curr + 1);
    ch = fs_in.get();
    fs_in.close();
    return 0;
}


3、使用文件指针获取文件大小:
原理:文件结尾的位置,就代表从文件开始的位置到结尾的字节数,即文件的大小!
#include <fstream>

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

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

    fs_in.seekg(ios::end);
    long size = fs_in.tellg();
    fs_in.close();
    return 0;
}


4、小作业:
通过文件读写的方式,自己实现一个函数,实现文件的拷贝功能。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值