seekp 函数用于已经打开要进行输出的文件,而 seekg 函数则用于已经打开要进行输入的文件。可以将 "p" 理解为 "put",将 "g" 理解为 "get",这样理解当然是有根据的,因为 seekp 可用于将信息 put(放入)到文件中,而 seekg 则可用于从文件中 get(获取)信息。
以下是 seekp 的用法示例:
file.seekp(20L,ios::beg);
第一个实参是一个 long 类型的整数,表示文件中的偏移量。这就是想要移动到的字节数。在该示例中,使用的是 20L(请记住,L 字符可以强制编译器将该数字视为一个 long 类型的整数)。该语句可以将文件的写入位置移动到编号为 20 的字节(所有编号从 0 开始,因此编号为 20 的字节实际上是第 21 个字节)。第二个实参称为模式标志,它指定从哪里计算偏移量。标志 ios::beg 表示偏移量是从文件开头算起的。也可以修改该参数,从文件末尾或文件中的当前位置计算偏移量。表 1 列出了所有 3 种随机访问模式的标志。
模式标志 | 描 述 |
---|---|
ios::beg | 从文件头开始计算偏移量 |
ios::end | 从文件末尾开始计算偏移量 |
ios::cur | 从当前位置开始计算偏移量 |
表 2 显示了 seekp 和 seekg 使用不同模式标志的示例。
语 句 | 如何影响读/写位置 |
---|---|
file.seekp(32L,ios::beg); | 将写入位置设置为从文件开头开始的第 33 个字节(字节 32) |
file.seekp(-10L,ios::end); | 将写入位置设置为从文件末尾开始的第 11 个字节(字节 10) |
file.seekp(120L,ios::cur); | 将写入位置设置为从当前位置开始的第 121 个字节(字节 120) |
file.seekg(2L,ios::beg); | 将读取位置设置为从文件开头开始的第 3 个字节(字节 2) |
file.seekg(-100L,ios::end); | 将读取位置设置为从文件末尾开始的第 101 个字节(字节 100) |
file.seekg(40L,ios::cur); | 将读取位置设置为从当前位置开始的第 41 个字节(字节 40) |
file.seekg(0L,ios:rend); | 将读取位置设置为文件末尾 |
请注意,表 2 中的一些示例使用了负偏移量。负偏移量导致读或写位置在文件中向后移动,而正偏移量则导致向前移动。
假设文件 letters.txt 中包含以下数据:
Byte 5 from beginning: f
Byte 10 from end: q
Byte 3 from current: u
//This program demonstrates the seekg function.#include <iostream>#include <fstream>using namespace std;int main(){ // Variable to access file char ch; // Open the file for reading fstream file ("letters.txt",ios::in); if (!file) { cout << "Error opening file."; return 0; } // Get fifth byte from beginning of Alphabet file file.seekg(5L,ios::beg); file.get(ch); cout << "Byte 5 from beginning: " << ch << endl; // Get tenth byte from end of Alphabet file file.seekg(-10L,ios::end); file.get(ch); cout << "Byte 10 from end: " << ch << endl; //Go forward three bytes from current position file.seekg(3L,ios::cur); file.get(ch); cout << "Byte 3 from current: " << ch << endl; // Close file file.close (); return 0;}程序输出结果:
Byte 5 from beginning: f
Byte 10 from end: q
Byte 3 from current: u
// This program demonstrates the use of a structure// variable to read a record of information from a file.#include <iostream>#include <fstream>using namespace std;const int name_SIZE = 51,ADDR_SIZE = 51,PHONE_SIZE = 14;//声明记录的结构struct Info{ char name[name_SIZE]; int age; char address1[ADDR_SIZE]; char address2[ADDR_SIZE]; char phone[PHONE_SIZE];};// Function Prototypeslong byteNum(int);voID showRec(Info);int main(){ // Person information Info person; // Create file object and open the file fstream people("people.dat",ios::in | ios::binary); if (!people) { cout << "Error opening file. Program aborting.\n"; return 0; } // Skip forward and read record 1 in the file cout << "Here is record 1:\n"; people.seekg(byteNum(1),ios::beg); people.read(reinterpret_cast<char *>(&person),sizeof (person)); showRec(person); // Skip backwards and read record 0 in the file cout << "\nHere is record 0:\n"; people.seekg(byteNum(0),sizeof (person)); showRec(person); // Close the file people.close(); return 0;}long byteNum(int recNum){ return sizeof (Info) * recNum;}voID showRec(Info record){ cout << "name:"; cout << record.name << endl; cout << "Age: "; cout << record.age << endl; cout << "Address line 1: "; cout << record.address1 << endl; cout << "Address line 2: "; cout << record.address2 << endl; cout << "Phone: "; cout << record.phone << endl;}程序屏幕输出结果:
Here is record 1:
name:cyuyan
Age: 20
Address line 1: No.1
Address line 2: No.2
Phone: 12345678
Here is record 0:
name:http://c.biancheng.net
Age: 5
Address line 1: No.1
Address line 2: No.2
Phone: 123456
总结
以上是内存溢出为你收集整理的C++ seekp和seekg函数用法详解全部内容,希望文章能够帮你解决C++ seekp和seekg函数用法详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)