例外“字符串不能为零长度”

时间:2012-02-04 13:57:21

标签: c# string stream

我们正在尝试从文本文件中读取每个单词并将其替换为另一个单词。 对于较小的文本文件,它运行良好。但是对于较大的文本文件,我们不断得到异常:“字符串的长度不能为零。 参数名称:oldValue“

void replace()
    {
        string s1 = " ", s2 = " ";
        StreamReader streamReader;
        streamReader = File.OpenText("C:\\sample.txt");
        StreamWriter streamWriter = File.CreateText("C:\\sample1.txt");
        //int x = st.Rows.Count;
        while ((line = streamReader.ReadLine()) != null)
        {
            char[] delimiterChars = { ' ', '\t' };
            String[] words = line.Split(delimiterChars);
            foreach (string str in words)
            {
                s1 = str;
                DataRow drow = st.Rows.Find(str);
                if (drow != null)
                {
                    index = st.Rows.IndexOf(drow);
                    s2 = Convert.ToString(st.Rows[index]["Binary"]);
                    s2 += "000";                                        
                   // Console.WriteLine(s1);
                   // Console.WriteLine(s2);
                    streamWriter.Write(s1.Replace(s1,s2)); // Exception occurs here
                }
                else
                    break;
            }
        }
        streamReader.Close();
        streamWriter.Close();
    }

我们无法找到原因。 提前谢谢。

4 个答案:

答案 0 :(得分:8)

执行string.Split时,如果序列中有多个空格或制表符,则可能会显示空条目。这些不能被替换,因为字符串是0长度。

使用带有StringSplitOptions参数的空结果的重载:

var words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);

答案 1 :(得分:5)

发生异常是因为s1在某些时候是一个空字符串。您可以通过替换

来避免这种情况
String[] words = line.Split(delimiterChars);

用这个:

String[] words = line.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);

答案 2 :(得分:4)

您想要像这样更改Split方法调用:

String[] words = line.Split(delimiterChars,StringSplitOptions.RemoveEmptyEntries);

答案 3 :(得分:2)

这意味着s1包含一个空字符串(“”),如果您的文件中有两个连续的空格或制表符,则会发生这种情况。