(标准?)问题的编码设计

时间:2013-02-27 06:11:11

标签: c algorithm

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

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

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

    我能想到的解决方案是在正在编写的第一个内容字符串之前编写标题字符串(通过使用标题字符串写入汇总每个内容字符串写入来实现,并使用布尔标志防止多个标题字符串写入),以及然后只有在写入标题字符串时才写入页脚字符串(由布尔标志控制)。

    这是它的顶级要点,只是想知道是否有适用于这类案件的标准方法。

    谢谢!

1 个答案:

答案 0 :(得分: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,您当前在cachedData中创建outHeader()
  • str发送到临时文件并在lineCount中递增outData()
  • 使用lineCount来确定outFooter中是否有缓存数据,并从临时文件中读取行以作为数据输出。