2013-03-25 29 views
2

我想問的是有一個函數可以從C中自下而上讀取文本文件?我們會得到fedcba讀取文本文件底部向上在C

如果沒有這樣的功能,我正在考慮將文本內容傳遞到數組中,然後顛倒數組,然後反向?你有這個問題的更好的解決方案:)

+0

[向後讀取文件?]的可能的副本(http://stackoverflow.com/questions/10813930/read-a-file-backwards) – 2013-03-25 14:01:25

+0

等等,這不是重複的。另一個問題是逐行反向閱讀。 – mkb 2013-03-25 14:03:29

+0

@mkb通過字符讀取文件字符以找到換行符或打印字符有什麼區別?至少它提供了一堆可能的解決方案,比如'fseek','內存映射文件... ... – 2013-03-25 14:05:25

回答

1

你可以開發自己的功能,使用fseek()從底部讀標準功能:

char *my_read(FILE *fp) 
{ 
    int i, size; 
    char *buffer; 

    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 

    buffer = malloc((size+1) * sizeof(char)); 

    for (i=0; i<size; i++) 
    { 
     fseek(fp, size-1-i, SEEK_SET); 
     buffer[i] = fgetc(fp); 
    } 
    buffer[size] = 0; 
    return buffer; 
} 
1

標準庫沒有功能來做到這一點。您可以將數據傳遞給可變字符數組並執行就地反轉。

這顯然不會從底部讀取文件到頂部,它從頭到尾讀取並使用O(N)時間和O(1)空間複雜度。你可以在尋找位置上玩耍並嘗試向後閱讀;看到表現會很有趣。

只是額外的信息

的複雜性分析見http://www.geeksforgeeks.org/an-in-place-algorithm-for-string-transformation/

1

下面的代碼可能會成爲你的目的,

char a[MAX]; 
int flag=1,i=0; 



fseek(fp, 0, SEEK_END); 
while(flag>0) 
{ 
    a[i]=fgetc(fp); 
    i++; 
    if(fseek(fp,-2,SEEK_CUR)==-1) 
    { 
     flag=0; 
    } 
} 
+0

你有關於fseek的好教程的鏈接,我對fseek一無所知,所以我不能理解您的代碼:( – 2013-03-25 14:30:32

+1

fseek將文件指針fp設置爲第二個和第三個參數指向的位置。嘗試此鏈接http://beej.us/guide/bgc/output/html/multipage/fseek.html – Deepu 2013-03-25 14:33:34

1

您可以開發自己的函數,從頭開始讀取,但從底部開始保存在數組中。

該函數將:

  1. 獲取文件
  2. 的大小分配字符緩衝區與(大小+ 1)
  3. 從開始讀出的文件,並在同一時間開始填寫的炭從最終

陣列它比每次讀

一次使用 fseek更簡單
char *my_read(FILE *fp) 
{ 
    int i, size; 
    char *buffer; 

    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 
    buffer = malloc((size+1) * sizeof(char)); 

    for (i=(size-1); i>=0; i--) 
    { 
     buffer[i] = fgetc(fp); 
    } 
    buffer[size] = 0; 
    return buffer; 
}