0

ソリューションの標準設計を保証するのに十分な標準的な問題のようです。

ファイルに x+2 (またはそれ以下) の文字列を書きたいとします。x 文字列はセクションのコンテンツを構成し、2 つの文字列はそのセクションの一種のヘッダーとフッターを作成します。問題は、コンテンツに文字列がない場合、ヘッダー/フッター文字列を記述しないことです。さらに、これらの x 文字列は、コード内の異なる場所から書き込まれます。したがって、現在の流れは次のとおりです。

  1. ヘッダー文字列を書き込む
  2. コンテンツ文字列を書く
  3. フッター文字列を書く

これにより、コンテンツが空の場合でもヘッダー/フッター文字列が書き込まれます。この場合、ヘッダー/フッター文字列を書き込まないようにする必要があります。

私が考えることができる解決策は、書き込まれている最初のコンテンツ文字列の前にヘッダー文字列を書き込むことです(各コンテンツ文字列の書き込みをヘッダー文字列の書き込みでファネリングし、ブールフラグを使用して複数のヘッダー文字列の書き込みを防止することによって実装されます)、次に書き込みますフッター文字列は、ヘッダー文字列が書き込まれている場合のみです (ブール値フラグによって制御されます)。

これはその最上位の要点ですが、このような場合に利用できる標準的なアプローチがあるかどうか疑問に思っています。

ありがとう!

4

1 に答える 1

2

これにはいくつかの解決策があります。

  • ヘッダーとデータ行をメモリ内キャッシュに書き込み、フッターを書き込もうとしたときにそれらを出力します (ただし、データ行がある場合のみそうでない場合は何も出力しません)。
  • 同じことですが、データキャッシュが大きすぎる場合に備えて一時ファイルを使用します。
  • ヘッダーと、それを出力したかどうかを覚えておいてください。

最初の 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

そのメモリ内キャッシュとファイルベースのキャッシュの唯一の違いは次のとおりです。

  • で現在作成cachedDataしている空の一時ファイルを作成し、lineCount を 0 に設定しますoutHeader()
  • str一時ファイルに送信し、 でインクリメントlineCountoutData()ます。
  • lineCountキャッシュされたデータがあるかどうかを判断するために使用しoutFooter、データとして出力するために一時ファイルから行を読み戻します。
于 2013-02-27T06:21:25.137 に答える