seekg如何找到文件的结尾?

7

在使用文件的 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();
    }

问题1:seekg实际上是否遍历整个文件内容,直到找到某个特殊的“EOF字符”?还是使用文件系统提供的其他信息来“知道”文件的结尾在哪里?

问题2:seekg是流寻址操作。这是否意味着整个文件的内容必须通过流进行传输?

如果我的理解有限,请谅解我。


1
关于“EOF字符”:https://latedev.wordpress.com/2012/12/04/all-about-eof/ - user395760
1个回答

10

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

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


@Mats Petersson 我一直在尝试找出获取文件大小的最佳方法,如果ifstream已经从文件系统知道文件的大小,那么我们必须做类似于到达文件末尾、获取大小,然后返回开头这样的事情,对我来说似乎非常不寻常。或者,正如有些人声称的那样,seekg到结尾和tellg方法是不可靠的,忽略结尾然后获取读取的字符数。然后我看到了struct stat方法,但我不确定它有多可移植。难道没有简单的方法吗? - Zebrafish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接