【问题标题】:Random lines not being written from streamwriter C#未从 streamwriter C# 写入随机行
【发布时间】:2015-10-02 03:55:10
【问题描述】:

我目前正在解决一些遗留代码的问题。代码读取 csv,检查数据的有效性,然后将文档写入输出文件。

我目前很难确定进程被挂起的原因。这几乎就像它陷入了无限循环。这个问题每次都发生在同一行(第 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;
                                                    }
                                                }

                                            }
                            }

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

【问题讨论】:

  • This makes me think the issue must be coming from the streamwriter. 但这让我觉得你的代码中存在一些你没有向我们展示的问题。
  • 我希望你在某个地方调用“Next()”方法,因为 Peek 所做的只是给你下一个字符,而不会在阅读器中前进!
  • 我一次读取字符.. 写入文件时我使用 sr.Read();
  • 您发布的内容甚至无法编译。您必须创建一个Minimal Complete Verifiable Example 以便任何人都能够帮助您,甚至让您自己在这方面取得任何进展。
  • @KevinMee 那么你的代码在哪里?您如何解析这些行(很可能存在错误)。这行int peek = sr.Peek(); while (peek > -1) 意义不大。显示您的真实代码

标签: c# file-io streamwriter


【解决方案1】:

由于 while (peek > -1) 将始终评估为真(如果流包含至少一个字符),您处于无限循环中。

正确的代码应该是这样的:

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 将永远运行。更不用说它可能发生在进一步阅读的字符上。

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

【讨论】:

  • 对。我在一个循环中检查文件的包含并写出一个新文件
  • @Kevin Mee 您的时间将永远运行。正确的代码是: while ( (peek = sr.Peek ()) > -1) { // 做一些事情,最后调用 sr.Read (); }
  • 这不是我遇到的问题。如果是这种情况,我所有的测试都会以无限循环结束。
  • @Kevin Mee 从您的新代码示例中,我可以说如果 (((char)peek).Equals(textQual)) 返回的代码行可能始终为 false。无论如何,我永远不会推荐这样的代码投入生产。如果第一个字符与 textQual 不相等,则 while 将永远运行
  • 为什么说它总是返回假?数据在每个数据块周围都带有 textQualifiers
猜你喜欢
  • 1970-01-01
  • 2011-10-29
  • 2012-06-14
  • 2018-08-24
  • 2013-11-02
  • 2011-03-03
  • 1970-01-01
  • 2023-04-04
  • 2012-06-16
相关资源
最近更新 更多