判断文件读写成功的函数
这个我们之前文章已经有用到的了 下面再列举一下
good
如果文件顺利打开且没有发生任何错误返回true 该方法也指出的最后一次读取输入的操作是否成功。
fail
方法用于判断最后一次读取数据的时候是否遇到了类型不配的情况,若是返回true(如果遇到了EOF,该方法也返回true)
bad
如果出现意外的问题 任意文件受损或硬件故障 最后依次读取数据的时候发生了这样的问题 bad()方法将返回true
读取文件的时候如何知道读取到了文件的末尾
可以用eof来判断最后一次读取是否遇到EOF即文件的末尾 是则返回true
妈,那么判断末尾的的方法我们已经知道了 我们该如何知道文件在当前文件的哪个位置
我们之前在C 语言中也提到了文件指针的这个概念 这里再来复习一下可以说是
文件指针可以理解为文件内部记录读取或者写入的当前位置 每次程序在读写文件时,磁盘中的文件指针就会向后移动一个字节
文件流提供以下成员函数来读取或配置文件指针:
tellg() 返回读取文件指针的当前位置
tellp() 返回写入文件指针的当前位置
seekg(指针偏移量) 将读取文件指针移到指定位置
seekg(指针偏移量,参照位置) 将读取文件指针移到指定位置
seekp(指针偏移量) 将写入文件指针移到指定位置
seekp(指针偏移量,参照位置) 将写入文件指针移到指定位置
第二个实参称为模式标志,它指定从哪里计算偏移量。标志 ios::beg 表示偏移量是从文件开头算起的。也可以修改该参数,从文件末尾或文件中的当前位置计算偏移量。表 1 列出了所有 3 种随机访问模式的标志。
ios::beg | 从文件头开始计算偏移量 |
ios::end | 从文件末尾开始计算偏移量 |
ios::cur | 从当前位置开始计算偏移量 |
通过这些成员函数我们就可以修改这些文件指针达到在我们需要的位置进行读写文件 我们可以通过代码来具体演示一下,实践是检验真理的唯一标准
代码语言:javascript复制 ofstream fs("test.txt");
if (fs.is_open())
{
fs << "hello!my name is marry" << endl;
}
int w = fs.tellp();
cout <<"当前写入文件位置: "<< w;
fs.close();
运行截图
tellp会返回当前写入文件的指针位置 也就是24 写文件写入的话会从24的位置继续写入 我们现在设置一下写入文件的文件指针 通过seekp成员函数
可以看到我们将写入文件的指针设置为0 则下一次写入文件的操作将会从文件0的位置开始写入
可以看到 我们将标志改到尾部 然后设置偏移量为0 表示从尾部加入 现在我们开始读文件 我们发现在使用>>进行读文件时 遇到空格和回车会自动停止读取 解决办法可以采用getline函数
代码语言:javascript复制#include<fstream>
#include<iostream>
using namespace std;
int main()
{
//写文件
ofstream fs("test.txt");
if (fs.is_open())
{
fs << "hello!my name is marry" << endl;
fs << "lucy" << endl;
fs << "kitty" << endl;
}
cout << "当前写入文件位置: " << fs.tellp() << endl;;
fs.seekp(0,ios::beg);
fs << "oooo" << endl;
fs.seekp(0,ios::end);
fs << "hhhh" << endl;
//读入文件
ifstream is("test.txt", ios::in);
if (is.is_open()) {}
char buf2[100] = { 0 };
is.getline(buf2, sizeof(buf2));
cout << buf2 << endl;
int tellg = is.tellg();
cout << tellg << endl;
is.seekg(0,ios::beg);
tellg = is.tellg();
cout << tellg << endl;
memset(buf2, 0, 100);
while (is.getline(buf2, sizeof(buf2)))
{
cout << buf2<<endl;
}
fs.close();
is.close();
}
我这里先写入数据 然后查看文件指针 在读取了前六个字节 我通过seekg()设置了读取文件的指针重新回到头部 下次再读取的时候 即是从文件头部0偏移的位置开始读取 具体变化可以看变量tellg