标题:一个Seek()方法不能被执行的问题
只看楼主
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
结帖率:40%
已结贴  问题点数:20 回复次数:8 
一个Seek()方法不能被执行的问题
本人是新手,以下是本人写的一个简单的文本文件读写程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char  a;
           
            FileStream fs1=new FileStream("D:\\file1.txt",FileMode.Open,FileAccess.ReadWrite);
            FileStream fs2=new FileStream("D:\\file2.txt",FileMode.Open,FileAccess.ReadWrite);
            StreamReader strmReader = new StreamReader(fs1);
            StreamWriter strmWriter = new StreamWriter(fs2);         
            while (strmReader.Peek() != -1)
            {
                fs1.Seek(2, SeekOrigin.Current);
                a = (char)strmReader.Read();
                strmWriter.Write(a);
            }
            strmReader.Close();
            strmWriter.Close();
        }
    }
}

执行后发现fs1.Seek(2, SeekOrigin.Current);这句没有起到作用,百思不得其解,感觉只要把fs1.Seek(2, SeekOrigin.Current)放在strmReader.Peek()后面就会被无视掉。
    怎么办啊!望高手赐教!

搜索更多相关主题的帖子: Seek 
2009-09-16 22:26
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
得分:0 
没人帮帮忙吗?
2009-09-16 23:03
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
得分:7 
将该流的当前位置设置为给定值。
fs1.Seek(2, SeekOrigin.Current);就是把当前位置往后移动2位
a = (char)strmReader.Read();读的时候不是从当前位置开始读
所以没有影响

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-09-17 08:44
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
得分:0 
感谢你的回答,但是我还是不太明白你说的意思。为什么a = (char)strmReader.Read();读的时候不是从当前位置开始读?
如果我想实现隔两个字符读写一个的操作,应该怎样编写代码?
2009-09-17 09:40
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
得分:0 
从什么位置开始读是打开文件函数的一个参数定的,读出来不用它不就行了吗

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-09-17 11:28
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
得分:0 
回复 5楼 jedypjd
你说的是一个解决办法。

但是我还是不明白我的a = (char)strmReader.Read();为什么不接受fs1.Seek(2, SeekOrigin.Current);的控制了呢?
前面已经声明了StreamReader strmReader = new StreamReader(fs1);

如果遇到需要倒退读写的情况怎么办?
2009-09-17 11:43
飙马
Rank: 5Rank: 5
来 自:马里亚纳
等 级:贵宾
威 望:15
帖 子:779
专家分:280
注 册:2007-3-28
得分:7 
这是因为:

    1、假如File1.txt里面的字符是“ABCDEFG”,strmReader.Peek()返回的可用字符,依次为“A”,“B”,“C”,“D”,“E”,“F”,“
G”;
   
    2、fs1.Seek(2, SeekOrigin.Current)不会影响strmReader.Read()的结果的;

你改成:        long b= fs1.Seek(1, SeekOrigin.Current);
                MessageBox.Show(b.ToString());
    看一下b的值,b第一个值为8(假如不含回车换行,7+1)。

[ 本帖最后由 飙马 于 2009-9-17 13:38 编辑 ]

IT精英如同彩票:平凡的人像5块也中不到一样普遍,努力一点你中了5元保了个本。奖金越高,机率也就越小,付出的也越多,盖茨如同500万一样稀有。虽然每天忙碌而平凡,但我努力成为精英,做梦中了500万。
2009-09-17 13:33
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
得分:0 
回复 7楼 飙马
谢谢!我仔细体会你说的每一句话,又试了试,发现确实是strmReader.Peek()这个语句捣鬼。

如果执行
        strmReader.Peek();
        long b= fs1.Seek(1, SeekOrigin.Current);
        MessageBox.Show(b.ToString());
得到的是b=8,如果去掉strmReader.Peek();得到的就是b=2.
为什么strmReader.Peek();这句把流的当前位置直接挪到了尾部呢?

我那个程序要用到while(strmReader.Peek()!=-1)来检测是否到了文件结尾,并且要用Seek()方法逐个字符地控制读写的位置(包括前进和后退)
该如何实现呢?

[ 本帖最后由 xhibm 于 2009-9-17 18:08 编辑 ]
2009-09-17 17:12
xhibm
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2009-9-16
得分:0 
哎,快一天了,还是没有得到满意的回答,继续等待.....
2009-09-17 21:16



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-285965-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.401413 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved