2012-12-17 85 views
3

即时通讯尝试在文本文件中存储素数的大量列表,如果我结束了我的程序,我需要能够读取文件的行以查看我离开的位置。我不知道如何阅读最后一行,无需先阅读文件的每一行。在C++中读取文件最后一行的最有效方法是什么?

+1

文本文件不是有效的格式来存储顺序素数,例如,它甚至可能会更快[生成所有32位素数](http://cr.yp.to/primegen.html),而不是从一个文本文件。 – jfs

+0

我会明确地以二进制格式存储数字,比如'__int64',而不是文本。寻找文件中的最后一个二进制数将是跳转到文件偏移量'((filesize/sizeof(__ int64)) - 1)* sizeof(__ int64)'的简单事情。 –

回答

3

我也不知道。只需将最后一个值写入单独的文件中,然后读取该值以知道要恢复的位置。

+0

不能这样做,因为它不会被保留,如果我再次运行文件 – user1767077

+0

@ user1767077 - 哎呀,错字;将最后一个值写入单独的**文件**。 –

+0

@ user1767077在另一个文件中,例如'last_prime.txt' –

2

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

但皮特贝克斯解决方案是一个更好的,我会用它来代替。

1

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

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

1整数是4字节。所以你可以使用fseek在文件中移动4 * 4 = 16 Byte。之后,你可以阅读最后一行。 (文件,16,SEEK_SET);

SEEK_SET表示开始文件。

+0

该文件不是二进制的(否则为什么用换行符分隔整数)因此一个整数不是严格的4个字节,例如1是1个字节,100是3个字节。 – jfs

+0

您也可以在fclose(file)之前使用whereAmI = ftell(file),然后再次打开文件fopen(file)和fseek(file,whereAmI,SEEK_SET) –

1

寻求到文件的末尾,而只是读向后直到你找到换行符,这意味着你已经找到了最后一行

0

的开始。如果你知道线的最大长度,这将是简单。

只需将指针指向文件末尾的位置减去此值即可。

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

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

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

相关问题