2013-02-27 50 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