2012-12-17 118 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

的開始。如果你知道線的最大長度,這將是簡單。

只需將指針指向文件末尾的位置減去此值即可。

從那裏開始讀取行並將它們放入緩衝區。當前一個字符是新行時清除緩衝區

當您用完文件時,緩衝區將包含它。

如果您不知道最大長度,則可以始終向後讀取文件。

相關問題