这是我的代码。 :
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行和半行。
我不是您可能看到的精简版/编剧专家。
任何想法或建议都会非常感激,因为这会让我感到沮丧。我确信这是我错误地使用它们。
答案 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);