Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

re reading the last line again with StreamReader.ReadLine()

Posted on 2008-06-13
4
Medium Priority
?
3,827 Views
Last Modified: 2012-05-05
In the example below I need to use sr.ReadLine() to read the lines out of a text file. Sometimes I may want to back the position of the streamreader up to the beginning of the previous line, so that the next call to sr.ReadLine() reads the previous line again. sr.BaseStream.Seek doesn't seem to be working for me and the sr.BaseStream.Position doesn't seem to reflect what I expect.
string filePath = @"c:\temp\debug.txt";
 
using (StreamReader sr = new StreamReader(filePath))
{
    string line1 = sr.ReadLine();
    string line2 = sr.ReadLine();
 
    // Back up so the next ReadLine reads line 2 again
    sr.BaseStream.Seek(-line2.Length, SeekOrigin.Current);
    sr.DiscardBufferedData();
 
    string line2Again = sr.ReadLine();
 
    if (line2 != line2Again)
    {
        Console.Write("This is not what I expect");
    }
}

Open in new window

0
Comment
Question by:southparksystems
2 Comments
 
LVL 11

Accepted Solution

by:
dbrckovi earned 1000 total points
ID: 21780458
Hi!

You could load the complete file in some kind of collection, and work with it.
Maybe something like this:


    public partial class Form1 : Form
    {
        StreamReader SR;
        List<string> FileLines = new List<string>();
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("First line: " + FileLines[0]);
            MessageBox.Show("Last line: " + FileLines[FileLines.Count - 1]);
            MessageBox.Show("Line before last: " + FileLines[FileLines.Count - 2]);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            //load all lines
            SR = File.OpenText("c:\\aaa\\aaa.txt");
            string CurrentLine = "";
            do
            {
                CurrentLine = SR.ReadLine();
                if (CurrentLine != null && CurrentLine.Length != 0)
                {
                    FileLines.Add(CurrentLine);
                }
            } while (CurrentLine != null && CurrentLine.Length != 0);
 
            SR.Close();
            MessageBox.Show("Lines in file: " + FileLines.Count);
        }
    }

Open in new window

0
 
LVL 86

Assisted Solution

by:Mike Tomlinson
Mike Tomlinson earned 1000 total points
ID: 21780482
ReadLine() strips off the carriage return/line feed at the end of the line...so you need to compensate for that.
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: Najam
Having new technologies does not mean they will completely replace old components.  Recently I had to create WCF that will be called by VB6 component.  Here I will describe what steps one should follow while doing so, please feel free to post any qu…
Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the re…
This video shows how to quickly and easily deploy an email signature for all users in Office 365 and prevent it from being added to replies and forwards. (the resulting signature is applied on the server level in Exchange Online) The email signat…
Loops Section Overview
Suggested Courses

810 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question