随机行不是从编写者C#

时间:2015-07-13 18:36:44

标签: c# file-io streamwriter

我目前正在努力修复一些遗留代码的问题。代码读取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;
                                                    }
                                                }

                                            }
                            }

我正在寻找对此问题的任何建议,因为我不确定这是从哪里来的。

1 个答案:

答案 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将永远运行。没有提到可以进一步阅读的字符。

上面显然是一段我不建议将它投入生产的代码。