16

これが私のコードです。:

FileStream fileStreamRead = new FileStream(pathAndFileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.None);
FileStream fileStreamWrite = new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);

                StreamWriter sw = new StreamWriter(fileStreamWrite);

                int readIndex = 0;
                using (StreamReader sr = new StreamReader(fileStreamRead))
                {
                    while (!sr.EndOfStream) {
                        Console.WriteLine("eof" + sr.EndOfStream);
                        readIndex++;
                        Console.WriteLine(readIndex);
                        string currentRecord = "";
                        currentRecord = sr.ReadLine();
                        if (currentRecord.Trim() != "")
                        {
                            Console.WriteLine("Writing " + readIndex);
                            sw.WriteLine(currentRecord);
                        }
                        else {
                            Console.WriteLine("*******************************************spaces ***********************");
                        }
                    }

1つのテストファイルと半分の行で2行を切り取り、次に実行している他のテストファイルで1行と半分の行を切り落としています。

私はストリームリーダー/ライターの専門家ではありません。

これは私をバタバタさせているので、どんなアイデアや提案も大歓迎です。これらを間違って使用しているのは私だと確信しています。

4

5 に答える 5

23

Flush/Close が不足しているか、単にusingライターが不足しています。

using(FileStream fileStreamWrite = 
  new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
{
  using(StreamWriter sw = new StreamWriter(fileStreamWrite))
  {
   // .... write everything here
  }
}
于 2012-10-04T21:06:42.063 に答える
9

ステートメントの最後の括弧の直後に、次のusingようにします。

sw.Flush();
sw.Close();

そこで、それはそれをするべきです。

于 2012-10-04T21:08:36.517 に答える
3

あなたがする必要がありFlushますStreamWriter。StreamWriter にはバッファーがあり、バッファーがいっぱいの場合にのみディスクに書き込みます。最後にフラッシュすることで、バッファ内のすべてのテキストがディスクに書き込まれるようにします。

于 2012-10-04T21:06:12.037 に答える
2

他の回答 ( using、および/または を使用flush/close) に加えて、彼らは実際には質問に答えていないと言うでしょう:

私は、ループヘッダーとその中の別の2回使用して呼び出すという事実に関連している という考えを持っています。StreamReaderEndOfStream while

stream終わりかどうかを理解する唯一の方法は、そこからデータを読み取ろうとすることです。だから私EnfOfStreamはそれをしていると思います.2回読むと、ストリーム処理に問題が発生する可能性があります.

問題を解決するには:

  • または、テキストファイルを読んでいることを考慮して、単純なTextReaderを使用します(私には思われます)

  • または、一度だけ呼び出すようにロジックを変更して、これ以上呼び出す必要はありませんConsole.WriteLine("eof" + sr.EndOfStream);

  • または、ロジックを変更するため、まったく使用EndOFStreamしないでください。ただし、行がnull.

于 2012-10-04T21:22:45.557 に答える
1

StreamWriter を正しく使用していません。また、あなたは常に行を読んでいるので、私はすでにそれをすべて行っている (そして適切に管理している) メソッドを使用します。

using (var writer = new StreamWriter("path"))
{
   foreach(var line in File.ReadLines("path"))
   {
       if (string.IsNullOrWhiteSpace(line)) 
       { /**/ }
       else
       { /**/ }
   }
}

... また ...

/* do not call .ToArray or something that will evaluate this _here_, let WriteAllLines do that */
var lines = File.ReadLines("path")
                .Select(line => string.IsNullOrWhiteSpace(line) ? Stars : line);

var encoding = Encoding.ASCII; // whatever is appropriate for you.
File.WriteAllLines("path", lines, encoding);
于 2012-10-04T21:34:37.830 に答える