C# 有人能解释一下在覆盖文本文件的第一行时出现的这种现象吗?

C# 有人能解释一下在覆盖文本文件的第一行时出现的这种现象吗?,c#,overwrite,file-writing,C#,Overwrite,File Writing,我正在做一个项目,在这个项目中,用户可以查看句子短语,并在句子中选择特定单词的特定含义,以最好的方式来描述它。我需要做的部分工作是保存所选当前句子的索引,以便在重新打开程序时,用户可以从停止的位置返回。那很容易 但是,当我试图覆盖保存他们工作的文件的第一行时,我遇到了一个问题,它包含查看的最后一句话的索引,即它会部分删除下一行或以其他方式删除下一行。到目前为止,我找到的最好的ie解决方案是重写整个文件,但我仍然想知道引擎盖下发生了什么 从本质上讲,我首先将以下内容写入一个文本文件: Andrew

我正在做一个项目,在这个项目中,用户可以查看句子短语,并在句子中选择特定单词的特定含义,以最好的方式来描述它。我需要做的部分工作是保存所选当前句子的索引,以便在重新打开程序时,用户可以从停止的位置返回。那很容易

但是,当我试图覆盖保存他们工作的文件的第一行时,我遇到了一个问题,它包含查看的最后一句话的索引,即它会部分删除下一行或以其他方式删除下一行。到目前为止,我找到的最好的ie解决方案是重写整个文件,但我仍然想知道引擎盖下发生了什么

从本质上讲,我首先将以下内容写入一个文本文件:

Andrew
ate
breakfast
然后我用WriteLine用“Andrew 122”重写了第一行,得到了以下结果:

Andrew 122
breakfast
使用Write,我得到了以下结果:

Andrew 122e
breakfast
有人能向我解释发生了什么事吗

作为参考,以下是我用来测试的代码:

    static void Main(string[] args)
    {
        string path = String.Format(@"C:\Users\User\Desktop\{0} Project\test.txt", @"C#");
        if (File.Exists(path))
            File.Delete(path);

        WriteToFile(path, true, "Andrew", "ate", "breakfast");
        WriteToFile(path, false, "Andrew 122");
    }

public static void WriteToFile(string path, bool newLine, params string[] line)
    {
        using (FileStream fStream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write))
        using (StreamWriter fWriter = new StreamWriter(fStream, Encoding.UTF8))
            for (int i = 0; i < line.Length; i++)
                if (newLine)
                    fWriter.WriteLine(line[i]);
                else
                    fWriter.Write(line[i]);
    }

这种现象是,您以人类的方式思考文件,在这里您可以看到换行,但StreamWriter是以字节为单位操作的。最初有一系列字节,请注意回车符和新行:

[A][n][d][r][e][w][\r][\n][a][t][e][\r][\n][b][r][e][a][k][f][a][s][t]
然后用122覆盖字节7-10

[A][n][d][r][e][w][  ][ 1][2][2][e][\r][\n][b][r][e][a][k][f][a][s][t]

不能在文件中间添加其他字符。您必须读取整个文件,然后用bck编写更改。@H.G.Sandhagen这不是真的。事实上,这正是正在发生的事情。新行和at将被替换为122。您在写入文件时没有插入任何新行。@Crowcoder:很抱歉,错误的显示/解释。你在回答中解释得好多了。当然,你可以在文件的中间写,但是你不能添加一些东西或者用6个字符替换9个字符的安得烈,并把剩下的部分保持为它。实际上,我找到了一种覆盖第一行的方法,那就是在第一行中添加一堆空格,然后在新行中添加更多空格,使行的长度保持不变。