gpt4 book ai didi

c++ - c++ 文件处理中的 tellg() 是什么,它是如何工作的?

转载 作者:行者123 更新时间:2023-11-30 03:27:17 24 4
gpt4 key购买 nike

我尝试使用 tellg() 访问要从文件中读取的下一个字符,如果文件只有一行文本,我会正确返回位置。但是当文件有多个时行它给了我一些异常值..我附上了我的代码和我在下面得到的输出..

   #include <iostream>
#include <fstream>

using namespace std;

int main()
{
char temp;
ifstream ifile("C:\\Users\\admin\\Desktop\\hello.txt");
ifile>>noskipws;
while(ifile>>temp)
{
cout<<temp<<" "<<ifile.tellg()<<endl;
}
}

output:
H 3
e 4
l 5
l 6
o 7

8
W 9
o 10
r 11
l 12
d 13
. 14
. 15

16
! 17
! 18
! 19

File : Hello.txt contains 3 lines as given below..

Hello
World
!!!

不明白为什么它在打印语句中以 3 开头而应该从 1 开始.. 当有 2 行时它从 2 开始打印。谁能给我解释一下……?

最佳答案

事实上,tellg() 并不是返回一个字节在流中的偏移量,而是一个 pos_type 描述符,它可以被 seekg() 重用。如果文件是二进制文件,它将匹配字节偏移量,但在文本流中不能保证。 (在 *ix 中它也会匹配,但在 Windows 中没有直接赋值。)

以二进制模式打开文件,因为 seekg() 与偏移量一起使用。如果文件的修改发生在程序的两次运行之间,则需要将 positionEof 存储在文件中。

注意:在二进制模式下,您实际上可以将 positionEof 存储为整数,但我更喜欢尽可能使用 explicite 类型。

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
streampos positionEof;

// Record original eof position.
ifstream instream("C:\\Users\\istvan\\Desktop\\hello.txt", ios::in | ios::binary);
if (instream.is_open()) {
instream.seekg(0, ios::end);
positionEof = instream.tellg(); // store the end-of-file position
instream.close();
}
else
cout << "Record eof position: file open error" << endl;

// Append something to the file to simulate the modification.
ofstream outstream("C:\\Users\\istvan\\Desktop\\hello.txt", ios::app);
if (outstream.is_open()) {
cout << "write" << endl;
outstream << "appended text";
outstream.close();
}

// Check what was appended.
instream.open("C:\\Users\\istvan\\Desktop\\hello.txt", ios::in | ios::binary);
if (instream.is_open()) {
instream.seekg(positionEof); // Set the read position to the previous eof
char c;
while ( instream.get(c))
cout << c;

instream.close();
}
else
cout << "Check modification: file open error!" << endl;

return 0;
}

关于c++ - c++ 文件处理中的 tellg() 是什么,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47508335/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com