我目前正在努力修复一些遗留代码的问题。代码读取csv,检查数据的有效性,然后将文档写入outfile。
我目前很难确定流程被挂起的原因。它几乎就像陷入无限循环。此问题每次都在同一行上发生(第262行)。我已经删除了该行,并且它运行到1885行,因为再次挂断。我继续删除会导致问题进入其文件的行并测试该文件。奇怪的是,当它只是文件中的那些时,errorLine文件运行正常。这让我觉得这个问题必须来自编写者。
我将streamwriter设置为autoFlush = true
。我也在使用using
块,以便处理编写器的Flush/Close
。
这些文件有许多不同的大小,有些只有几行,有些则有几千行。
foreach (String e in fileNames)
{
using (StreamWriter sw = new StreamWriter(e.Replace(inputDirectory, outputDirectory), false, Encoding.Unicode))
{
sw.AutoFlush = true;
using (StreamReader sr = new StreamReader(e,Encoding.Unicode))
{
int peek = sr.Peek();
while (peek > -1)
{
if (((char)peek).Equals(textQual))
{
sw.Write(((char)sr.Read()));
peek = sr.Peek();
if (((char)peek).Equals(textQual2))
{
sw.Write(((char)sr.Read()));
peek = sr.Peek();
while (peek > 1)
{
if (((char)peek).Equals((char)0x0A) || ((char)peek).Equals((char)0x0D))
{
check = false;
row++;
if (firstcol == 0)
{
firstcol = col;
}
col = 0;
break;
}
else if (((char)peek).Equals(del))
{
check = false;
break;
}
else if (((char)peek).Equals((char)0x22))
{
sr.Read();
doubleq++;
}
else
{
sw.Write(((char)sr.Read()));
peek = sr.Peek();
break;
}
}
}
}
我正在寻找对此问题的任何建议,因为我不确定这是从哪里来的。
答案 0 :(得分:1)
你处于无限循环中,因为while(peek> -1)将始终评估为true(如果strream包含至少一个字符)。
正确的代码是这样的:
int peek = 0;
while ( (peek = sr.Peek ()) > -1) {
char c = (char)peek;
// doe whatever you want with picked character
sr.Read ();
}
在我看来,这段代码非常危险,因为有些情况下,while可以永远运行。例如,if语句:
if (((char)peek).Equals(textQual))
上面,如果第一个字符与textQual不相等,那么while将永远运行。没有提到可以进一步阅读的字符。
上面显然是一段我不建议将它投入生产的代码。