2013-02-27 51 views
0

似乎是一個很基本問題的解決,以保證標準設計:的編碼設計問題

說我想要寫在文件X + 2(或以下)的字符串。 X字符串組成部分的內容和這兩個字符串成爲一種頁眉和頁腳該節的。美中不足的是,我不會寫在頁眉/頁腳字符串是否有內容無弦。此外,這些x字符串是從代碼中的不同位置寫入的。所以目前的流動是:

  1. 寫頭字符串
  2. 內容寫入字符串
  3. 寫頁腳字符串

這導致被寫入頁眉/頁腳字符串,即使內容是空的,而且我必須解決這個問題,即在這種情況下不寫入頁眉/頁腳字符串。

我能想到的解決方案是在正在寫入的第一個內容字符串之前寫入標題字符串(通過彙集每個內容字符串寫入一個標題字符串寫入,具有防止多頭字符串寫入的布爾標誌)然後寫僅在頭字符串已被寫入頁腳字符串(由布爾標誌管轄)。

這是它的頂級要點,如果有像這些情況下,可用的標準方法只是想知道。

謝謝!

+0

您使用/計劃使用哪種編程語言? – Raptor 2013-02-27 06:15:33

+0

是的,你只是想有一個布爾,'header_has_been_written',你檢查每個字符串寫入,如果你還沒有發出頭,並在最後檢查一次,看看你是否需要發出頁腳。 – 2013-02-27 07:33:43

+0

@ShivanRaptor,語言是C.對不起,我以前沒有看到您的評論。 – AarCee 2013-02-27 11:18:19

回答

2

有許多解決方案,以這樣的:

  • 頭和數據線寫入到內存中的高速緩存,並將其輸出在嘗試寫頁腳(但前提是時間數據線,否則輸出無)。
  • 同樣的事情,但它使用臨時文件的數據緩存,如果它太大。
  • 記住標題以及是否輸出它。

由於前兩個解決方案涉及效率低下(緩存可能的大量數據,或使用相對較慢的外部存儲),因此我將專注於後者。見註釋底部就怎麼做緩存(一)

不需要緩存數據的方法只是指示您是否寫了標題。在每個數據行之前,只有當標誌還沒有設置時才輸出標題(並設置標誌)。您也可以使用該標誌來控制頁腳(如果頭一直沒有輸出,也不應該頁腳是):

def outHeader (str): 
    headerText = str 
    headerSent = false 

def outdata (str): 
    if not headerSent: 
     write headerText 
     headerSent = true 
    write str 

def outFooter (str): 
    if headerSent: 
     write str 

該解決方案也許是不需要數據緩存方面要簡單得多。


(一)如果沒有想要去的緩存解決方案(儘管意見,這是一個次優解),下面的僞代碼顯示如何可以做到:

def outHeader (str): 
    cachedHeader = str 
    cachedData = "" 

def outdata (str): 
    cachedData = cachedData + str + "\n" 

def outFooter (str): 
    if cachedData != "": 
     write cachedHeader 
     write cachedData 
     write str 

在內存中緩存並基於文件的高速緩衝存儲器之間的唯一區別是:

  • 創建一個空的臨時文件並將lineCount設置爲0,您當前在outHeader()中創建了cachedData
  • str發送到臨時文件並在outData()中遞增lineCount
  • 使用lineCount決定是否存在outFooter中的緩存數據,並從臨時文件中讀回行作爲數據輸出。
+0

好的建議。我確實想到了一個緩存,但覺得它會消耗大量的內存,如果寫入的數據很大,它可能會變得很大。 – AarCee 2013-02-27 06:43:16

+0

@ user1157812,請參閱使用臨時文件作爲緩存的更新,以用於那些您認爲緩存的數據可能太多的情況。還有一種非緩存解決方案可能是三者中最好的。 – paxdiablo 2013-02-27 07:44:08

+0

感謝您的建議。但我認爲這看起來多了一些工作,而不是值得。 – AarCee 2013-03-01 13:15:34