在C ++中使用tellp

时间:2010-08-23 05:34:43

标签: c++

我对tellpseekg函数有一些误解。例如,当我运行以下代码时。

#include <iostream>
#include <ostream>
#include <fstream>
using namespace std;
int main(){
    string s("in Georgia we are friends to each other");
    ofstream out("output.txt");
    for (int i=0; i<s.length(); i++){
        cout<<"file pointer"<<out.tellp();

        out.put(s[i]);
        cout << " " << s[i] << endl;
    }
    out.close();
    return 0;
}

结果如下。

pointer 0
pointer 1 i
pointer2 n
pointer  3
pointer 4 -g
........

等等。据我所知,第一个指针0指针只是文件,然后指向字符串中的第一个字符,依此类推。

现在考虑以下代码。

#include <fstream>
using namespace std;

int main () {
    long pos;

    ofstream outfile;
    outfile.open ("test.txt");

    outfile.write ("This is an apple",16);
    pos = outfile.tellp();
    outfile.seekp (pos-7);
    outfile.write (" sam",4);

    outfile.close();

    return 0;
}

结果是:

This is a sample

这一行pos = outfile.tellp();,我认为如第一个例子中那样得到零。在这个片段中,outfile.seekp (pos-7)是什么意思?指向-7或?

的指针

2 个答案:

答案 0 :(得分:3)

示例是here

从同一页面:

在这个例子中,tellp用于在写入操作之后获取put指针的位置。然后指针移回7个字符以修改该位置的文件,因此文件的最终内容应为: 这是一个样本

答案 1 :(得分:2)

tellp给出了put指针的当前位置。 outfile.seekp (pos-7)语句将put指针从其当前位置向后移动7个字节。 在你的例子中,它指向超出字符串“这是一个苹果” 如果你做pos-7, 它会转到存在'n'字母的位置。 它从那里覆盖字符串“sam”。 所以结果字符串变成“这是一个样本”