2017-01-17 9 views
2

をファイルに書き込む前に:代わりに、後続のファイル書き込み前に各文字列をプリントアウトのプリント出力、私はこのコードを持っていると仮定しHaskellの

import qualified Data.ByteString as B 

main = do 
      ... --some code that gets an array of ByteStrings called "files" 
      putStrLn "Saving myFile1" 
      B.writeFile "myFile1.bin" $ files!!0 
      putStrLn "Saving myFile2" 
      B.writeFile "myFile2.bin" $ files!!1 
      putStrLn "Done!" 

、それだけでファイルが保存された後に一度にすべてをプリントアウトしているようです。この種の機能は、すべてのファイル書き込みが完了した後にのみこれらのメッセージを取得するため、進行状況をユーザーに通知するのに不便です。

私のコードは明らかに悪くありません(私はsequenceの関数リストを使用しています)が、これは問題をよく示しています。私が間違ってやっていることは何ですか、これはまったくありませんか?

+3

*バッファリング*の問題のように私には見えます。 –

+2

この例では現象が発生していないことは明らかですので、より多くのコードを参照する必要があります。あなたは 'sequence'と言います。これが問題の原因かもしれません。 – Michael

+0

特に、あなたが連続して書いているバイトのリストをどうやって取得していますか? – Michael

答えて

0

@WillemVanOnsemと同様に、これはバッファリングの問題です。各印刷後に手動でバッファをフラッシュするか、またはchange the buffering mode entirelyを実行することができます。

import System.IO 
import qualified Data.ByteString as B 

main = do 
      ... --some code that gets an array of ByteStrings called "files" 
      putStrLn "Saving myFile1" 
      hFlush stdout 
      B.writeFile "myFile1.bin" $ files!!0 
      putStrLn "Saving myFile2" 
      hFlush stdout 
      B.writeFile "myFile2.bin" $ files!!1 
      putStrLn "Done!" 
      hFlush stdout 

または

import System.IO 
import qualified Data.ByteString as B 

main = do 
      ... --some code that gets an array of ByteStrings called "files" 
      hSetBuffering stdout LineBuffering 
      putStrLn "Saving myFile1" 
      B.writeFile "myFile1.bin" $ files!!0 
      putStrLn "Saving myFile2" 
      B.writeFile "myFile2.bin" $ files!!1 
      putStrLn "Done!" 
関連する問題