0

似乎是一个足够标准的问题,可以保证解决方案中的标准设计:

假设我想在文件中写入 x+2(或更少)字符串。x 字符串组成部分的内容,这两个字符串构成该部分的页眉和页脚。问题是,如果内容中没有字符串,我不会编写页眉/页脚字符串。此外,这些 x 字符串是从代码中的不同位置编写的。所以现在的流程是:

  1. 写入标题字符串
  2. 写入内容字符串
  3. 写页脚字符串

即使内容为空,这也会导致写入页眉/页脚字符串,我必须解决这个问题,即在这种情况下不写入页眉/页脚字符串。

我能想到的解决方案是在正在写入的第一个内容字符串之前写入标题字符串(通过将每个内容字符串写入与标题字符串写入相结合来实现,并使用布尔标志防止多个标题字符串写入),然后编写仅当标题字符串已被写入(由布尔标志控制)时,页脚字符串。

这是它的顶级要点,只是想知道是否有可用于此类情况的标准方法。

谢谢!

4

1 回答 1

2

对此有多种解决方案:

  • 将标题和数据行写入内存缓存,并在您尝试写入页脚时输出它们(但前提是有数据行,否则不输出)。
  • 同样的事情,但使用一个临时文件作为数据缓存,以防它太大。
  • 记住标题以及您是否已输出它。

由于前两种解决方案效率低下(可能缓存大量数据,或使用相对较慢的外部存储),我将专注于后者。请参阅底部关于如何进行缓存的注释(a)

不需要缓存数据的方法是仅指示您是否编写了标头。在每条数据线之前,仅当尚未设置标志时才输出标题(并设置标志)。您还可以使用此标志来控制页脚(如果尚未输出页眉,则页脚也不应输出):

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

就不需要数据缓存而言,此解决方案可能要简单得多。


(a)如果您确实想使用缓存解决方案(尽管有人建议它是次优解决方案),以下伪代码显示了它是如何完成的:

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 您当前cachedDataoutHeader().
  • 发送str到临时文件并lineCountoutData().
  • 用于lineCount确定是否有缓存数据outFooter并从临时文件中读取行以作为数据输出。
于 2013-02-27T06:21:25.137 回答