6

在对文件使用 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 是一个寻流操作。这是否意味着文件的全部内容必须通过流?

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

4

1 回答 1

9

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

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

于 2013-02-10T00:14:01.967 回答