【发布时间】:2016-07-24 09:28:31
【问题描述】:
考虑一个名为!file io test.txt 的文件,其中包含以下几行:
1|adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|1080000
并考虑这个代码段:
FileStream fs = new FileStream(@"C:\Users\McLovin\Desktop\!file io test.txt", FileMode.Open, FileAccess.ReadWrite);
StreamWriter sw = new StreamWriter(fs);
StreamReader sr = new StreamReader(fs);
char c = (char)sr.Read(); // line 4
sw.Write('~');
sw.Flush();
在第 4 行之后,文件指针应该已经读取了第一个字符并将自身移动到第二个字符。这在我读取文件时按预期工作,但是当我写入文件指针时,它总是指向文件的末尾并开始在那里写入。如果我将第 4 行注释掉,StreamWriter 将正常工作(从头开始覆盖文件)。
当前代码产生:
1|adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|108000
~
但我希望它产生这个:
1~adrian|louis|50000
2|jeff|potato|200000
3|michael|de santa|980000
4|jemmy|mccormic|500400
5|jack|cohen|4300000
6|ethan|trump|1080000
【问题讨论】:
-
基本上,我建议避免同时使用
StreamWriter和StreamReader包装相同的Stream。这几乎可以肯定是StreamReader.Read读取整个数据缓冲区的问题... -
对了,你可以在这里看看
StreamWriter的内部结构:referencesource.microsoft.com/#mscorlib/system/io/… -
同意@JonSkeet。将流 pos 重置为 0,以从 BOF 开始写入。
标签: c# file-io filestream streamreader streamwriter