gpt4 book ai didi

c++ - ifstream::seekg 给出错误的结果

转载 作者:行者123 更新时间:2023-11-30 01:07:37 25 4
gpt4 key购买 nike

我正在玩 ifstream 以熟悉它。我正在尝试使用 seekg 来判断文件的位置,但它给了我错误的结果。

想法是:

  1. 打开文件
  2. 打印文件位置
  3. 从文件中读取一个字符
  4. 打印文件位置
  5. 从文件中读取一个字符
  6. 打印文件位置
  7. 关闭文件。

原始文件如下所示(windows 格式):

文件.txt

aA
bB
cC
dD
eE
fF

运行我的代码,我得到了结果:

position: 0
got: a
position: 6
got: A
position: 7

但是,对于这个文件:

文件.txt

aAbBcCdDeEfF

我得到这些结果

position: 0
got: a
position: 1
got: A
position: 2

这是我使用的代码:

测试.cpp(mingw/gcc5.3)

#include <fstream>
#include <iostream>

using namespace std;

static char s[10];

int main(int argc, char **argv)
{
ifstream f("file.txt");
cout << "position: " << f.tellg() << "\n";
f.read(s, 1);
cout << "got: " << s << "\n";
cout << "position: " << f.tellg() << "\n";
f.read(s, 1);
cout << "got: " << s << "\n";
cout << "position: " << f.tellg() << "\n";
f.close();

return 0;
}

下面分别是两个文本文件的两个十六进制编辑器 View :

原创:enter image description here修改:enter image description here

我希望两者分别产生结果 0、1、2,但是原始实验并非如此。

有人能解释一下这里发生了什么吗?

问题:

  1. 我应该怎么做才能获得正确的文件位置?

Answer: use ifstream("file.txt", ios_base::in | ios_base::binary) constructor over ifstream("file.txt") constructor.

  1. 是什么导致 f.tellg 默认给出这些奇怪的值 0、6、7 而不是预期的 1、2、3?

可能的解释(测试下面 Holt 的回答)

此代码中的 f.tellg 求助于 f.rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in),它负责生成值 0、6、 7(但仅当 ios_base::binary 未在构造/打开时指定)。

#include <fstream>
#include <iostream>

using namespace std;

static char s[10];

int main(int argc, char **argv)
{
ifstream f("file.txt");
cout << "position: " << f.rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in) << "\n";
f.read(s, 1);
cout << "got: " << s << "\n";
cout << "position: " << f.rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in) << "\n";
f.read(s, 1);
cout << "got: " << s << "\n";
cout << "position: " << f.rdbuf()->pubseekoff(0, ios_base::cur, ios_base::in) << "\n";
f.close();

return 0;
}

注意传递ios::in | ios::binary 作为 ifstream 构造函数的第二个参数使两个文件都按预期运行,但我还想知道是什么导致默认行为给出这些奇怪的 tellg 值。

注意tellg() function give wrong size of file?的区别.该问题默认设置了 ios::binary,并使用 seek;这里的这个问题既有ios::binary又有without,并且不使用seek。总的来说,这两个问题有不同的背景,知道那个问题的答案并不能回答这个问题。

最佳答案

tellg() 返回的值没有任何“错误”结果:当文件以文本模式打开时,返回值为未指定(即它除了可以用作 seekg() 的输入外没有任何意义)。

基本上,对 basic_fstream 上的 tellg() 的调用回退到 std::ftell 1 函数,它说(C 标准,§7.21.9.4 [文件定位函数],重点是我的):

long int ftell(FILE *stream);

The ftell function obtains the current value of the file position indicator for the stream pointed to by stream. [...] For a text stream, its file position indicator contains unspecified information, usable by the fseek function for returning the file position indicator for the stream to its position at the time of the ftell call; the difference between two such return values is not necessarily a meaningful measure of the number of characters written or read.

1 tellg() 回落到 rdbuf()->pubseekoff(0, std::ios_base::cur, std::ios_base::in),返回到 basic_filebuf::seekoff(0, std::ios_base::cur, std::ios_base::in) 然后返回到 std::ftell().

关于c++ - ifstream::seekg 给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44291635/

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