2012-07-30 87 views
2

当我输入is.seekg(0)时,它将我带到我的流的开头。但是,当我输入is.seekg(ios :: end)时,它将我带到第二个字符。为什么会发生。我认为我对此的误解源于对流如何运作的根本缺乏理解。我会认为,当你提供常量ios :: end时,它会把你带到那个流的末尾。但是,它似乎让你向前移动了一个角色。Istream seekg()偏移量和ios ::结束

cin.seekg(0, ios::end); 
    int length = cin.tellg(); 
    cout << length << endl; 

    cin.seekg(0); 

    cout << cin.tellg(); 

当我输入<文件包含 “123456789”

的输出是10 0

现在,如果我这样做:

cin.seekg(ios::end); 
    int length = cin.tellg(); 
    cout << length << endl; 

输出是2

这是为什么?

回答

2

您正在将std::ios_base::seekdir类型的东西转换为std::istream::pos_type类型,并调用只有一个参数的seekg版本。该版本的seekg将指针移动到绝对位置,而不是相对位置。

ios::end是用于相对偏移量的逻辑位置,而不是绝对位置。

1

你不能依靠STDIN寻找。这是因为它可能来自多个来源,包括绝对不可寻求的管道。由于STDIN绑定到文件流,因此重定向文件时可能会有效。我不知道你是否可以依靠这一点,但这是我的猜测。我从来没有考虑过在STDIN上寻找。我总是认为它是一个管道,即使它不是。与STDOUT一样。我不会输出一些内容,然后尝试回溯并“覆盖”该输出。如果你发现自己需要寻找标准流,你应该重新考虑你的方法。

2

此代码只是工作由事故

cin.seekg(ios::end); 
int length = cin.tellg(); 
cout << length << endl; 

end来自一个enum seekdir {beg, cur, end};,所以ios::end恰好是转换为与价值2整数。

只是不幸的是,seekg的一个过载参数是一个整数,所以这个调用变成了cin.seekg(2)。虽然技术上有效的代码,但这绝对不是你想要的。