在C++中, seekg() 和 seekp() 是流类的成员函数,用于在流的内部指针中进行定位。其中, seekg() 用于输入流(如 ifstream ), seekp() 用于输出流(如 ofstream )。
seekg() 函数
在C++中, seekg() 函数用于将文件读指针移动到特定位置。这个函数主要用于处理文件输入流,并允许你在文件中查找并读取指定位置的数据。
seekg() 函数的语法如下:
streampos seekg (streampos pos);
streampos seekg (streamoff off, ios_base::seekdir way);
其中, streampos 是一个类型,表示流的位置,而 streamoff 表示流中的偏移量。 ios_base::seekdir 是一个枚举类型,指定了相对于偏移量的查找方向。 ios_base 是一个类,定义了输入输出流类的基本特征。
第一种语法形式中, pos 表示要移动到的位置。 seekg() 函数返回的是当前读指针位置,也就是移动之前的位置。
第二种语法形式中, off 表示相对于查找方向的偏移量,而 way 则指定了查找方向。 way 可以取以下值之一:
- ios_base::beg 表示相对于流的开头进行查找。
- ios_base::cur 表示相对于当前读指针位置进行查找。
- ios_base::end 表示相对于流的末尾进行查找。
seekg() 函数返回的是新的读指针位置。
下面是一个示例,演示了如何使用 seekg() 函数来读取文件中的特定数据:
#include <fstream>
#include <iostream>
int main() {
std::ifstream file("example.txt");
if (!file.is_open()) {
std::cerr << "Failed to open file!\n";
return 1;
}
// 获取文件大小
file.seekg(0, std::ios::end);
std::streampos fileSize = file.tellg();
// 读取最后一个字符
file.seekg(-1, std::ios::end);
char lastChar;
file.get(lastChar);
std::cout << "File size: " << fileSize << " bytes\n";
std::cout << "Last character: " << lastChar << "\n";
file.close();
return 0;
}
在这个示例中,我们首先打开文件,然后使用 seekg() 函数将读指针移动到文件的末尾,以获取文件大小。然后,我们使用 seekg() 函数将读指针移动到文件末尾的前一个位置,以读取最后一个字符。最后,我们输出文件大小和最后一个字符。
需要注意的是,在使用 seekg() 函数之前,我们需要确保文件已经成功打开,即判断文件是否打开成功。此外,我们还需要确保文件不为空,以避免使用 seekg() 函数失败。
总之, seekg() 函数是一个非常有用的函数,可以帮助我们在文件中定位特定的数据,进而更好地进行数据处理。
seekp() 函数
在 C++ 标准库中, seekp() 是一个与输出流关联的函数,用于设置文件写入位置。该函数用于定位文件指针,以便在文件的指定位置写入数据。
seekp() 函数的原型为:
streampos seekp (streampos pos);
streampos seekp (streamoff off, ios_base::seekdir way);
其中,第一个参数 pos 表示要设置的写入位置,类型为 streampos , streampos 是一个类型,表示流中的某个位置,可以通过其他输入输出流函数(如 tellp() )获得。
第二个参数 off 表示相对于指定位置 way 的偏移量, way 表示寻找位置的方向。这两个参数的类型均为 streamoff 和 ios_base::seekdir ,分别表示相对于当前位置的偏移量和指定偏移量的方向。 ios_base::seekdir 类型有三个值:
- ios_base::beg :从文件开头开始定位。
- ios_base::cur :从当前位置开始定位。
- ios_base::end :从文件末尾开始定位。
例如,要从文件开头开始定位,可以使用以下代码:
file.seekp(0, ios_base::beg);
此外, seekp() 函数也可以用于对缓冲区进行定位。当使用 seekp() 函数改变文件指针位置时,如果当前缓冲区中存在未写入文件的数据,这些数据将被刷新到文件中。
需要注意的是,在某些情况下, seekp() 可能会导致在某些操作系统上的性能下降。因此,在使用 seekp() 时应该谨慎,并尽量避免多次调用该函数。
下面是一个简单的示例,演示如何使用 seekp() 函数将数据写入文件的指定位置:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
// 创建文件
ofstream file("example.txt");
// 向文件写入数据
file << "Hello, World!";
// 使用 seekp() 定位文件指针,并写入数据
file.seekp(7);
file << "C++";
// 关闭文件
file.close();
return 0;
}
在此示例中,首先创建了一个名为 example.txt 的文件,并向其中写入了字符串 "Hello, World!"。然后,使用 seekp() 函数将文件指针定位到字符串中的第 7 个字符位置,并将字符串 "C++" 写入到该位置。最后,关闭文件。
执行该程序后, example.txt 文件的内容将变为 "Hello, C++ld!"。