2017-05-05 162 views
-4

功課 - 無需代碼。僞代碼正常。C - 無需使用fgets/getline,一次從文件1行讀取

我們只允許使用3個libc函數:readmallocfree。然而,在學校的課程中,我們已經實現並編寫了許多我們自己的libc函數版本,那些我們允許使用的版本是。我會列出它們,但其中大約有50個,所以相反,我一定會提及哪些我不能使用。

我的問題......我必須採取什麼措施從文件中讀取一行並將該行存儲爲字符串,而不需要\n?有沒有人能夠引導我完成整個過程?因爲現在,我甚至不知道從哪裏開始。我知道如何使用閱讀,我會認爲自己介於C和初級和中級技能之間,但是花了整整一天的時間搜索Google後,每次詢問這個問題時,接受的答案總是涉及使用fgetsgetline,我們不允許使用它們,原因很明顯。我已經實現了我自己的許多libc函數的版本,這些函數可能有助於這個項目,但是任何能夠使這個項目快速簡單的東西顯然是不允許的。

再次,請不要代碼,雖然僞代碼是好的,但我更喜歡它,如果有人可以幫助我更好地瞭解我需要'告訴計算機'做什麼,並從那裏我應該沒問題自己寫代碼。

+3

一次讀取一個字符,存儲它們。當你點擊\ n時,停止。 –

+0

重複的問題;回答這裏回答你的問題(基本上是什麼菲爾M說):http://stackoverflow.com/questions/19769542/reading-from-file-using-read-function – Nugenrules

+1

不要氣餒dowvotes。你的問題是一個很好的問題。 – fuz

回答

4

僞代碼來讀取1線

buffer to 0, size to 0, size_used to 0 
    loop 
     read 1 character 
     no success? - break loop 
     size_used >= size 
     make buffer bigger (maybe 2x, at least 1) 
     [This involves allocating a new buffer, copy existing data, freeing old buffer] 
     add character to buffer 
     was character a \n? - break loop 

    Nothing read? 
     return NULL 
    right-size buffer to size_used+1 
    append \0 
    return buffer (calling code needs to eventual free it.) 

大量的效率的提高是可能的。我建議從基本版本開始,獲得正確的功能,然後考慮改進,如

  1. 性能:從文件中讀取,一次可能是4k字節。

  2. 性能:重新使用返回的緩衝區。

  3. 使健壯和檢查分配失敗。

+0

本着與其他標準庫(例如'strcat','sprintf','scanf'等)一致的精神,我建議'* buffer'由*調用者*而不是* callee * 。此外,關於閱讀*可能一次4K *字節,我不認爲這是一個性能的改善。我認爲[我在* dailyprogrammer * excersize here](https://www.reddit。com/r/dailyprogrammer/comments/2q2zxe/weekly_18_holiday_code_a_time_of_sharing/cnf265o /),但我喜歡你的反饋... – Sebivor

+0

@Seb鏈接的提交不顯示結果。代碼本身有一個'for()'循環組件,可以從'fgetc()'v。'fread()'性能比較中拿走。代碼的結果將是一個例子,而不是一個證明。代碼與'stdin'流一起工作,它可以與本文所述的_file_有顯着的性能差異。我沒有看到鏈接的代碼很好地支持你的疑問。 IAC,任何不改變O()複雜性的性能改進都會降低對學習者(OP)的價值,這就是爲什麼我的答案沒有把注意力集中在僞代碼中。感謝您的洞察力。 – chux

+0

然後,您的列表應該包含'-O3'和其他優化專用開關,因爲它們可以徹底改變整個項目的實際性能特徵。請舉例說明你的4K讀取優化沒有這樣一個'for'循環......哦,另一個話題是,如果優化功能打破*功能,它是一種優化。 OP只想讀*到下一個換行符*和'ungetc'只能保證一次工作*所以你還需要依賴'fseek',*這不能保證有效地使用二進制文件的偏移量來尋找, 'stdin' * – Sebivor