2013-09-25 22 views
2

我有一個包含(符號數)的數據文件安排如下:立式文件數據尋求用C

291 
-1332 
    912 
    915 
-1347 
    196 
    1110 
    -997 
    120 
    1017 
    -775 
    -443 
    985 
    13 
    -690 
    369 
    673 
    -826 
    -14 
    891 
    -546...(thousands of lines) 

我想用這將我的文件指針移動到特定數量的函數對於ex.1100

線目前我使用下面的代碼來跳過並轉到特定的行/數

if (offset>0)//offset is number of destination line 
{ 
while(fscanf(f,"%d",&buffer)!=EOF) //f is file pointer ;Buffer is int variable 
    { 
    i++; 
    if(i==offset) 
      break; 
    } 

} 

我想用更好的代碼比這個,因爲這代碼需要花費更多的時間s偏移量增加, 任何想法,以簡單的方式(和更短的時間)實現這一點?

回答

1

如果所有的數字(例如)六個字符長,你必須在每一行的最後一個\n換行符,你可以得到行號n(從零開始)由fseeking到n * 7。線0在偏移量0處,線1在偏移量7處,線2在偏移量14處,依此類推。

同樣,線1100(在第一千一百零一線),可以得到與類似:

if (fseek (f, 7700L, SEEK_SET) != 0) { 
    // something went wrong. 
} 
if (fscanf (f, "%d", &buffer) != 1) { 
    // something else went wrong. 
} 

將爲任何固定寬度的線工作,你只需要調整基於倍增因數行寬和行結束符(例如,DOS編碼可能有兩個字符,\r\n)。當然,你可能會發現將整個文件讀入內存中的整數數組(這取決於如何有),以便隨機訪問數據的速度變得非常快 - 這是因爲沒有有理由回到初始加載後的任何數據文件。

+0

+1謝謝。我現在會嘗試使用它。 –

+0

使它成功感謝:) –

1

您有一些選擇。如果您必須保持號碼的文本文件,因爲每一行是一個可變長度,你可以:

  • 的mmap(內存映射)的文件和索引的內容,行號到陣列。爲此,您需要對文件進行一次傳遞,並在每行開始處生成一個文件偏移量數組。
  • 將文件重寫爲二進制數據(例如,整數的數組) - 由於每個整數都在nth_int * sizeof(int)處找到,所以它更緊湊和更快查找。您在開始時一次支付罰款以重新寫入文件。
  • 很大程度上取決於您的環境和用例,這就是您更好的判斷規則。最重要的是,測試和測量,看看它是否值得。
+0

我不認爲我可以做它我正在處理DSP處理器 –

+0

如果你正在做這麼多I/O操作,它會減慢你的速度,使用DSP有什麼意義?理想情況下,你應該得到你需要在內存中使用的東西,這樣你就可以100%地使用你的DSP,不是嗎? –