【C++】ifstream、file.good、 file.seekg、file.tellg、file.read详解

本文主要对ifstream、file.good、 file.seekg、file.tellg、file.read等函数功能进行详细解析,包括原理和步骤,最后通过一个示例进行总结。

原理详解

std::ifstream file()

std::ifstream 是C++中用于打开一个输入文件的语句。std::ifstream 是C++标准库中的一个类,用于从文件进行输入。

std::ifstream file(file_name, std::ios::binary);

在这行代码中:

file_name 是一个字符串,表示要打开的文件的名称。
std::ios::binary 是一个打开模式,表示以二进制形式打开文件。这意味着你可以读取例如字节等二进制数据。如果不指定这个模式,文件将以文本模式打开,这意味着行尾字符可能会被处理(例如在Windows中,文本模式会将 “\r\n” 转换为 “\n”)。

file.good()

file.good() 是C++中用来检查文件流是否处于良好状态的方法。如果文件流没有错误,那么 file.good() 将返回 true。否则,如果有错误发生,它将返回 false。
这个函数通常在读取或写入文件后被调用,以检查操作是否成功。例如:

std::ifstream file("example.txt");
if (!file.good()) {
    std::cerr << "File operation failed!" << std::endl;
    return;
}

file.seekg()

file.seekg(0, file.end); 

是 C++ 中的一个文件操作函数,用于将文件读取指针移到文件的末尾。
这个函数的作用是将读取指针移动到文件的结尾,这样在下次读取文件时,将从文件的末尾开始读取。
file.seekg() 函数的第一个参数是一个整数,**表示偏移量,而第二个参数是一个枚举值,表示偏移的起始位置。**在这个例子中,起始位置是 file.end,表示从文件末尾开始计算偏移量。

file.seekg(0, file.beg);

file.seekg(0, file.beg);它用于移动文件读取指针到文件的开始位置。
file.beg 是 std::istream 类的一个成员常量,表示从文件的开始位置开始偏移。

需要注意的是,file.seekg() 函数并不会改变文件中已经读过的内容,它只是改变了下一次读取操作的位置。此外,如果在打开文件时没有指定模式为 ‘r’(即只读模式),那么在执行 file.seekg() 时可能会抛出 IOError 异常。

file.tellg()

 size = file.tellg();

file.tellg() 是C++中的一个函数,它返回当前文件读取指针的位置。这个函数常被用于获取文件的大小。如上面file.seekg(0, file.end),已经将指针位置放到了文件最后,所以读取的是文件大小。
假设文件对象叫做 file,可以用 file.tellg() 来获取文件大小,并将结果存储在变量 size 中。
这个方法通常用于二进制文件,因为文本文件中的换行符(‘\n’)在二进制文件中并不代表实际的数据,所以使用 tellg 获取的文件大小可能比实际文件内容大。如果你处理的是文本文件,可能需要考虑换行符的问题。

file.read()

char *buffer = new char[size];
assert(buffer);
file.read(buffer, size);

第一行代码使用 new 关键字动态分配了一个大小为 size 的字符数组。**new 返回一个指向新分配的字符数组的指针,**该指针被存储在 buffer 变量中。

第二行代码使用 assert() 函数来检查 buffer 是否不为 NULL。如果 buffer是 NULL,那么 assert() 函数将会抛出一个异常并终止程序。在这种情况下,由于我们已经分配了内存(第一行代码),判断是不为NULL的。

第三行,使用 read() 函数从file中读取了size个字节的数据并存储到了 buffer 中。

file.close()

file.close()

该命令与std::ifstream file()相对用,用于关闭文件,这将释放系统资源,以便其他程序或操作可以访问该文件。

示例

#include <iostream>
#include <fstream>
#include <assert.h>
int main()
{
    std::ifstream file("example.txt", std::ios::binary); // 打开文件 example.txt
    //判断文件是否有问题
    if (!file.good())
    {
        //若文件有问题,输出错误信息
        std::cerr << "read " << "example.txt" << " error!" << std::endl;
    }
    size_t size = 0;
    //
    file.seekg(0, file.end);
    size = file.tellg();
    std::cout << "File size is: " << size << " bytes\n";
    std::cout << "123" << std::endl;
    file.seekg(0, file.beg);
    char* serialized_engine = new char[size];
    assert(serialized_engine);
    //用于在file读取size个字节保存到serialized_engine中
    file.read(serialized_engine, size);
    file.close();

    getchar();


}

运行上述示例,返回结果如下图。
在这里插入图片描述

在这里插入图片描述
文本文件内容如上图,文本文件中只有14个数值,但字节是20个。这个原因是四行每行一个int类型,一共16个字节,还有三行换行符,3*2=6个字节,所以一共20个字节。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木彳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值