本文主要对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个字节。