【问题标题】:How does seekg find the end of the file?seekg 如何找到文件的结尾?
【发布时间】:2013-01-25 10:22:10
【问题描述】:

在对文件使用 seekg 和 tellg 的场景中,我想知道幕后发生了什么?

    // Open file and get file size
    int myFileSize;
    std::fstream myFile;
    myFile.open(myFileName, std::ios::in|std::ios::binary);
    if (myFile.is_open())
    {
        myFile.seekg(0, std::ios::end);
        myFileSize = myFile.tellg();
        myFile.seekg(0, std::ios::beg);
        myFile.close();
    }

Q1: seekg 是否真的遍历文件的全部内容,直到找到一些特殊的“EOF 字符”?还是它使用文件系统提供的一些其他信息来“知道”文件的结尾在哪里?

Q2: seekg 是一个流搜索操作。这是否意味着文件的全部内容都必须通过流?

如果我对这一切是如何运作的只有一个初步的了解,请原谅我。

【问题讨论】:

标签: c++ fstream seekg


【解决方案1】:

Q1:不会。操作系统会知道文件的大小,seekg() 将使用该知识 - 无论文件是 1、100 还是 10000000000 字节长,它都需要几乎相同的时间。

Q2:不。它只是设置当前的“获取指针”,在 Windows 或 Linux 系统中转换为“SetFilePos”或“lseek”。几乎所有其他操作系统都有类似的概念。

【讨论】:

  • 谢谢你,很有帮助
  • @Mats Petersson 我一直在试图找出获取文件大小的最佳方法,如果 ifstream 已经从文件系统中知道文件的大小,那么对我来说,我们似乎很不寻常d 必须做一些事情,比如去文件的末尾,获取大小,然后返回到开头。或者,正如有些人声称的 seekg to end 和 tellg 方法不可靠,忽略到最后然后获取读取的字符数。然后我看到了 struct stat 方法,但我不确定它的可移植性如何。没有简单的方法吗?
猜你喜欢
  • 1970-01-01
  • 2018-01-05
  • 2023-03-28
  • 2012-06-16
  • 1970-01-01
  • 2015-10-10
  • 2014-12-09
  • 1970-01-01
  • 2013-10-24
相关资源
最近更新 更多