2013-07-04 28 views
0

我有我的數據在磁盤上的大文件。現在我想查找這些數據的某些部分的大小(以字節爲單位),而不將這些數據轉儲到單獨的文件中。有沒有可能這樣做。在C++/C中查找一部分文件的大小?

E.g.可以說我的文件是10000000000行。現在我想找到1000000行的大小。我知道我可以將這100行保存在一個單獨的文件中並找到它的大小,但我不想這樣做。有沒有其他的出路,或者這是唯一的出路。

+0

如果每一行的相等字節可以大致除以總大小。否則,你必須閱讀文件。 –

+1

您將不得不閱讀文件(除非線條長度相同!)。 –

回答

3

是的,沒有。您可以閱讀(但不保存)您關心的數據,並使用ftell/tellg來查找您當前的文件位置。因此,開始關注你所關心的事情,獲得​​職位,閱讀並結束自己關心的事情,重新獲得職位,然後減去規模。

「是」和「否」的原因是C和C++標準不能保證您得到的結果將與磁盤上的數據大小完全匹配。例如,如果您使用的是Windows,則新行會在外部「\ r \ n」和內部「\ n」之間進行轉換 - 標準並未說明是否將計爲一個或兩個字符。

如果這樣還不足以達到您的目的,您可以一次讀取一個字符的數據並計算字符數。有了這個功能,您可以根據自己的情況考慮平臺的變化(例如,在Windows下爲\n添加一個額外的字符)。

+1

簡單的答案是:正式的否,但是如果你在Unix機器上或Windows上,兩個'tellg'(或者'ftell',如果這些值長時間適用)之間的區別將會起作用。 –

+0

@JamesKanze此代碼:'fseek(fp,0,SEEK_SET);對於(i = 1; i <= 100; i ++)while((c = getc(fp))=='\ n')break; size_100 = ftell(fp);'是**不可靠。 –

+0

@JamesKanze:好吧,考慮到差異會給你一些價值,但很難確定這個價值的含義。一旦你弄清楚了它的含義,它很可能與你想要的不符。 –

1

如果你知道如何找到您所關心的部分的開頭和結尾,然後你可以使用fstream::tellg()(或C中使用ftell(file))爲出發點,並減去從終點的fstream::tellg()。但是,如果您沒有簡單的方法來查找起點和終點,除非您找到您關心的位,否則只能通過文件讀取內容,然後計算內容的大小,直到找到結尾。

0

您可以在興趣區間的開始使用ftell()/ fgetpos(),比掃,直到該節結束時,再次調用同樣的功能,並計算差異,這將是該部分的大小。

請記住,在文本文件與二進制文件(例如Windows)不同的系統上使用文本文件時,ftell()可能會感到困惑。

+0

你不能對'fgetpos()'的結果進行算術運算。 –