Streamwriter有时会在一条线的中间切断我的最后几行?

时间:2012-10-04 21:04:19

标签: c# streamwriter

这是我的代码。 :

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 ***********************");
                        }
                    }

用一个测试文件和半行切断2行,然后用另一个测试文件对齐1行和半行。

我不是您可能看到的精简版/编剧专家。

任何想法或建议都会非常感激,因为这会让我感到沮丧。我确信这是我错误地使用它们。

5 个答案:

答案 0 :(得分:18)

您缺少同花顺/关闭或仅为您的作家using

using(FileStream fileStreamWrite = 
  new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
{
  using(StreamWriter sw = new StreamWriter(fileStreamWrite))
  {
   // .... write everything here
  }
}

答案 1 :(得分:9)

using语句的右括号之后,执行以下操作:

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

那里应该这样做。

答案 2 :(得分:2)

您需要Flush StreamWriter。 StreamWriter有一个缓冲区,只有当缓冲区已满时才会写入磁盘。通过最后刷新,您可以确保缓冲区中的所有文本都写入磁盘。

答案 3 :(得分:1)

除了其他答案(使用using和/或flush/close)之外,还会说他们实际上没有回答这个问题:“为什么它可能会削减几行。”

我对主题有一个想法,它与您使用StreamReader并在{a}中调用EndOfStream 的事实相关: {1}}循环标题,另一个在其中。

了解while结束的唯一可行方法是尝试从中读取一些数据。所以我怀疑stream这样做,并且阅读它两次,可能会在流处理中产生问题。

解决问题:

  • 或者使用简单的TextReader,考虑到您正在阅读文本文件(在我看来)

  • 或者将您的逻辑更改为仅调用一次,因此不再需要调用EnfOfStream

  • 或者更改您的逻辑,所以根本不要使用Console.WriteLine("eof" + sr.EndOfStream);,而是逐行阅读,直到该行为EndOFStream

答案 4 :(得分: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);