【问题标题】:What is the most effective way to read the last line of a file in c++?在 C++ 中读取文件最后一行的最有效方法是什么?
【发布时间】:2012-12-17 21:08:03
【问题描述】:

我试图在一个文本文件中存储大量素数列表,如果我结束我的程序,我需要能够读取文件的行以查看我离开的地方。我不知道如何读取最后一行而不先读取文件的每一行。

【问题讨论】:

  • 文本文件不是存储连续素数的有效格式,例如,generate all 32-bit primes 甚至可能比从文本文件中读取它们更快。
  • 我肯定会以二进制格式存储数字,比如__int64,而不是文本。查找文件中的最后一个二进制数很简单,只需跳转到文件偏移量((filesize / sizeof(__int64)) - 1) * sizeof(__int64)

标签: c++ text-files


【解决方案1】:

我也不知道。只需将最后一个值写入一个单独的文件,然后读取该值即可知道从哪里恢复。

【讨论】:

  • 不能这样做,因为如果我再次运行该文件,它将不会被保留
  • @user1767077 - 哎呀,错字了;将最后一个值写入单独的文件
  • @user1767077 进入另一个文件,例如last_prime.txt
【解决方案2】:

您可以使用 setg() 跳转到文件末尾并猜测一行的距离。如果您的点和文件末尾之间有换行符,那么您就在倒数第二行并且知道最后一行是什么。

但 Pete Beckers 的解决方案要好得多,我会改用它。

【讨论】:

    【解决方案3】:

    您可以计算数字的字节数。

    例如,您有 5 个数字,您想读取最后一个数字。

    1 个整数是 4 个字节。因此,您可以使用 fseek 在文件中移动 4*4=16 字节。之后你可以阅读最后一行。

    fseek (file , 16 , SEEK_SET);

    SEEK_SET 表示文件的开始。

    【讨论】:

    • 文件不是二进制文件(否则为什么要用换行符分隔整数)因此一个整数不是严格的 4 个字节,例如,1 是 1 个字节,100 是 3 个字节。
    • 您也可以在 fclose(file) 之前和再次打开文件后使用 whereAmI=ftell(file) fopen(file) 和 fseek(file, whereAmI, SEEK_SET)
    【解决方案4】:

    找到文件的最后,然后向后阅读,直到找到换行符,这意味着你找到了最后一行的开头

    【讨论】:

      【解决方案5】:

      如果您知道行的最大长度,这将很容易。

      只要指向文件末尾位置的指针减去这个值即可。

      从那里开始读取行并将它们放入缓冲区。前一个字符换行时清除缓冲区

      当您用完文件时,缓冲区将包含它。

      如果您不知道最大长度,您可以随时向后读取文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-10
        • 2015-10-09
        • 2013-02-08
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多