在输入文件中找不到字符串

时间:2013-10-21 21:30:18

标签: c# streamreader

我有一个文本文件,我试图插入一行代码。使用我的链接列表我相信我可以避免必须取出所有数据,对其进行排序,然后将其转换为新的文本文件。 我所做的是提出下面的代码。我设置了bool,但它仍然没有用。我经历了调试器,它似乎正在进行的是它正在通过整个列表(大约10,000行)并且它没有找到任何真实的东西,因此它不会插入我的代码。

此代码的原因或错误是什么?

List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));


 using (StreamReader inFile = new StreamReader("Students.txt", true))
 {
    string newLastName = "'Constant";
    string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
    string line;
    string lastName;
    bool insertionPointFound = false;
    for (int i = 0; i < lines.Count && !insertionPointFound; i++)
    {
        line = lines[i];
        if (line.StartsWith("(LIST (LIST "))
        {
            values = line.Split(" ".ToCharArray());
            lastName = values[2];
            if (newLastName.CompareTo(lastName) < 0)
            {
                lines.Insert(i, newRecord);
                insertionPointFound = true;
            }
        }
    }
    if (!insertionPointFound)
    {
        lines.Add(newRecord);
    }

2 个答案:

答案 0 :(得分:4)

您只是将文件读入内存而不是将其提交到任何地方。

我担心您将不得不加载并完全重写整个文件。文件支持附加,但它们不支持插入。

您可以按照与其相同的方式写入文件

string[] lines;
/// instanciate and build `lines`
File.WriteAllLines("path", lines);

WriteAllLines也需要IEnumerable,因此如果您愿意,可以将List字符串传入其中。


还有一个问题:看起来好像您正在阅读两次文件。一个ReadAllLines,另一个StreamReader

答案 1 :(得分:2)

至少有四种可能的错误。

  • 您已经阅读过不需要打开流式读取器 所有的线条。 (好吧,这不是一个错误,但是......)
  • 如果您的行以空白开头,则可以愚弄对StartsWith的检查 空间,你会错过插入点。 (添加修剪将删除此处的任何问题)
  • CompareTo行中,您检查&lt; 0但是你应该检查== 0.如果字符串是等价的,则CompareTo返回0,但是......
  • 要检查两个字符串是否相等,您应该避免使用CompareTo 在上面的MSDN链接中解释但使用string.Equals

    List<string> lines = new List<string>(File.ReadAllLines("Students.txt"));
    string newLastName = "'Constant";
    string newRecord = "(LIST (LIST 'Constant 'Malachi 'D ) '1234567890 'mdcant@mail.usi.edu 4.000000 )";
    string line;
    string lastName;
    bool insertionPointFound = false;
    for (int i = 0; i < lines.Count && !insertionPointFound; i++)
    {
        line = lines[i].Trim();
        if (line.StartsWith("(LIST (LIST "))
        {
            values = line.Split(" ".ToCharArray());
            lastName = values[2];
            if (newLastName.Equals(lastName))
            {
                lines.Insert(i, newRecord);
                insertionPointFound = true;
            }
        }
     }
     if (!insertionPointFound)
         lines.Add(newRecord);
    

我没有将错误的写回错误列为错误。希望你刚刚省略了那部分代码。否则这是一个非常简单的问题。 (但我认为使用CompareTo的方式可能是你问题的主要原因)

编辑查看下面的评论,Sam I Am的答案似乎适合您。当然,您需要回写修改后的行数组。如果您没有写入文件的代码,则对内存中的行数组进行所有更改,并且不会将任何内容写回文件。但是,您不需要新文件

File.WriteAllLines("Students.txt", lines);