1

我有一个文本文件,我试图在其中插入一行代码。使用我的链接列表,我相信我可以避免将所有数据取出,对其进行排序,然后将其放入一个新的文本文件中。我所做的是想出了下面的代码。我设置了我的布尔值,但它仍然无法正常工作。我浏览了调试器,它似乎正在浏览整个列表(大约 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);
    }
4

2 回答 2

4

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

恐怕您将不得不加载并完全重写整个文件。文件支持追加,但不支持插入。

您可以像读取文件一样写入文件

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

WriteAllLines也需要一个IEnumerable,所以List如果你愿意,你可以将一个字符串传递到那里。


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

于 2013-10-21T21:32:36.597 回答
2

至少有四个可能的错误。

  • 不需要打开流式阅读器,您已经阅读了所有行。(好吧,这不是一个错误,但是......)
  • 如果您的行以空格开头并且您将错过插入点,则对 StartsWith 的检查可能会被愚弄。(添加修剪将消除此处的任何问题)
  • CompareTo行中,您检查 < 0,但您应该检查 == 0。如果字符串相等,CompareTo 返回 0,但是.....
  • 要检查两个字符串是否相等,您应该避免使用上面 MSDN 链接中解释的 CompareTo,但使用 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);
于 2013-10-21T21:36:32.060 回答