Streamwriter 有时会在一行中间切断我的最后几行?
Posted
技术标签:
【中文标题】Streamwriter 有时会在一行中间切断我的最后几行?【英文标题】:Streamwriter is cutting off my last couple of lines sometimes in the middle of a line? 【发布时间】:2012-09-25 23:58:03 【问题描述】:这是我的代码。 :
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 行半行。
我不是您可能看到的流式阅读器/写入器专家。
任何想法或建议将不胜感激,因为这让我很生气。我确定是我用错了。
【问题讨论】:
【参考方案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);
【讨论】:
【参考方案2】:除了其他答案(使用using
和/或flush/close
)之外,他们会说他们实际上并没有回答这个问题:“为什么它可能会剪掉几行。”
我有一个 idea 关于主题,它与您使用 StreamReader
并调用 EndOfStream
两次的事实有关:在 while
循环标题中,还有一个在里面。
了解stream
是否结束的唯一可能方法是尝试从中读取一些数据。所以我怀疑EnfOfStream
会这样做,并且阅读两次可能会在流处理中产生问题。
解决问题:
或者使用简单的TextReader,考虑到您正在阅读文本文件(在我看来)
或者将您的逻辑更改为只调用一次,因此不再调用Console.WriteLine("eof" + sr.EndOfStream);
或者改变你的逻辑,所以根本不要使用EndOFStream
,而是逐行阅读,直到该行是null
。
【讨论】:
【参考方案3】:你需要Flush
你的StreamWriter
。 StreamWriter 有一个缓冲区,只有在缓冲区已满时才会写入磁盘。通过在最后刷新,您可以确保缓冲区中的所有文本都写入磁盘。
【讨论】:
@UserSmith,毕竟写过一次,在文件上也丢失了(见我的回答)【参考方案4】:在using
语句的右大括号之后,执行以下操作:
sw.Flush();
sw.Close();
好了,应该可以了。
【讨论】:
遇到了这个答案,我基本上有同样的问题。对于我的情况,这有很大帮助。谢谢。【参考方案5】:您缺少 Flush/Close 或只是 using
为您的作家。
using(FileStream fileStreamWrite =
new FileStream(reProcessedFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
using(StreamWriter sw = new StreamWriter(fileStreamWrite))
// .... write everything here
【讨论】:
@Tigran - 大多数 Writer 和 Stream 类都有大小有限的内部缓冲区,因此它们会定期将数据提交到底层存储。结果存储了一些数据,但如果不刷新/关闭,最后一个块可能会丢失。以上是关于Streamwriter 有时会在一行中间切断我的最后几行?的主要内容,如果未能解决你的问题,请参考以下文章
c# StreamWriter 应用中,我想每一行中写入两个不同性质的数据,该怎么写呢