以下博文均是个人自学 测试的结果...
在C#中创建流文件的时候,多数是对文件流进行字符串的操作,所以C#中才产生了这样一个专门用来对字符文件进行操作的类系统,这里我们着重介绍下FileStream(文件流操作)、StreamWriter(字符输出流)、StreamReader(字符输入流)
也是基于自己的使用需要,对一个文本文件我需要打开,并随意的设置当前的流指针位置并在上面写入东西。但是经过应用,我发现字符流无法对文件流的指针进行操作,所以思前想后找不到解决办法。后来用FileStream的指针操作Seek和文件流配合,实现了这样的功能。不过在使用过程中有很多要注意的地方,下面一一的举例来说明。
首先,是追加还是修改的问题!
有两种打开文件的方式,一种是追加,一种是普通的打开。经过测试发现,普通的open在写的时候,会覆盖原来的位置的字符
这种形式是覆盖的形式,也就是说可以通过fs来移动文件指针,并修改原来指针位置上的字符。
另一种
则这个时候文件指针会自动移动到文件尾部,而且如果想用fs来移动指针,则会抛出异常!!
好,现在确定了,使用前面一种形式。
现在假如test.txt文件里面是一行字符“1234567890”
这样运行的结果是:$234567890
那现在我们这样:
而这样以后运行结果成了:12$#567890
我们预期的结果应该是:$2#567890 才对,可现在为什么出问题了呢?
原因就是,在第一次写$的时候,并没有被立即写到文件流中去,而是等到执行Close的时候才一并被写进去。而在Close的时候,文件的指针已经被移动到了2的位置,所以在Close的时候,首先在2的位置把缓冲区中的$写进去,然后再写#。
那么,怎么解决这个问题呢?
其实只要在写$的语句之后加上这样一句:
sw.Flush();
然后再试一下我们就会发现,写到文件里德成了我们预期的 $2#567890 结果。这是因为,在第一次写$后,Flush语句可以当时就把缓冲区中的内容立即写进去,这时候指针还在文件首部,所以就写了个$并覆盖1。而后面的移动指针再写就不再影响前面的操作了。。这就是Flush的功能。恩..不注意的话相当容易出问题的!
好的,下面我们再加上StreamReader同时来进行操作。
在read之前并没有加入Flush,我们看下执行结果:1234567890$#(txt),34567890(Console),而且txt的输出时在ReadLine之后,因为如果是在它之前,Console输出的应该是34567890$#才是..
这个结果是很显然的,因为sr.ReadLine之后,指针移动到文件尾,所以,在Close的时候才把$#写入..回到上节我们说的那个问题。
因此,只要在sr.ReadLine之前加上:sw.Flush();就可以成功的输出:12$#567890(txt),567890(Consol)
文件输出...让人上火的东西!搞了好久才算弄个小明白...知道这只是冰山一角,恩 具体的以后用到再说吧。。