Question

Reading and Storing in String STL

Asked by: sarahsthss

I have to read a text file samp.txt. That file contains 10 lines. I have to read from lines 3 to 6. The 3 rd line begins with the word "begin" and the 6 th line ends with the word "end". How can I read them?. After reading, how can I store them using string STL?. Please give some example code.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2004-03-05 at 02:12:06ID20908066
Tags

stl

,

string

,

read

,

line

Topics

C++ Programming Language

,

Microsoft Visual C++

Participating Experts
3
Points
100
Comments
17

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. LPSTR to string(STL)
    am looking to convert a LPSTR string to a STL string, but cant find much in the msdn, please help-)
  2. STL
    Why prefix is better than postfix in STL?
  3. STL Question
    I need to add 4 insertion methods to the STL for list. What I would like to know is whether or not using a generic doubly linked list file with pointers to its head and tail which a 3rd party has written would be considered to be using STL, or do I have to modify the list fi...
  4. STL: istream.getline -> string
    Hi, I'm in my ternal battle with STL again - how do I correctly get a line from a stream into a STL string, like while (!stream.eof() && !stream.bad()) { // string line = stream.getline << ???? } TIA Peter

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: rstaveleyPosted on 2004-03-05 at 02:33:41ID: 10521373

Here's a framwork for you to flesh out....

--------8<--------
#include <fstream>
#include <string>

int main()
{
        std::ifstream f("samp.txt");
        std::string str;
        while (getline(f,str)) {
              // ...
        }
}
--------8<--------

 

by: sarahsthssPosted on 2004-03-05 at 03:12:42ID: 10521535

The above code reads all the lines from the text file samp.txt. But I need to read the lines 3 to 6. How to read the lines 3 to 6 that starts with the word "begin" and ends with the word "end"?. Please explain with the sample code.

 

by: rstaveleyPosted on 2004-03-05 at 03:34:26ID: 10521639

Either use a line counter or do a find to look for "begin"/"end". The following uses find...

--------8<--------
#include <iostream>
#include <fstream>
#include <string>

int main()
{
        std::ifstream f("samp.txt");           // Process this file
        std::string str;                             // Reading lines into str
        bool processing = false;                // Flag set true, while processing
        while (getline(f,str)) {                   // Read line into str
                if (str.find("begin") == 0) {    // String starts with "begin"?
                        processing = true;        // Start processing
                        continue;                     // .. but ignore this line
                }
                else if (str.find("end") == 0)  // Start starts with "end"
                        processing = false;       // Stop processing
                if (processing) {                   // Are we processing?
                        // Do something with your string
                        std::cout << "Do something with \"" << str << "\"\n";
                }
        }
}
--------8<--------

 

by: itsmeandnobodyelsePosted on 2004-03-05 at 03:43:02ID: 10521671

Replace the while loop of the sample above by this

  ...
  bool begin = false;
  bool end    = false
  while (getline(f,str)) {
        if (!begin && str.find("begin") == 0)
        {
            begin = true;
             //..
        }
        else if (begin && !end)      
       {
              if (str.find("end")== 0)
              {
                   end = true;
                   //...
              }
              else
              {
                    // do something with the strings between
              }    

        }

Regards, Alex

 

by: stefan73Posted on 2004-03-05 at 04:31:05ID: 10521873

Hi sarahsthss,
Is this homework? It definitely smells like homework.

Cheers,
Stefan

 

by: sarahsthssPosted on 2004-03-05 at 04:35:11ID: 10521894

Thanks for your reply. Between "begin" and "end", there are 2 lines as follows:

    a: 12,0.7,12,12.5
    b: text, 23, 24, 10
I have to read the first line after colon(:) and store 12 , 0.7,12 and 12.5 in separate variables. Like that, I have to do for the 2 nd line. Please explain me with the sample code.

 

by: stefan73Posted on 2004-03-05 at 04:44:34ID: 10521951

sarahsthss,
Some considerations which may help you:
1. How do you convert from a text line into a set (array) of values?
   -> Walk an index to the first colon.
   -> Loop:
        Skip over comma or spaces.
        Mark begin of value start.
        walk your index until comma or end of string.
        copy what you found in a new string. Convert it eventually.
      Until end of string
     
2. Which type do you use to store your values in? Are they all integers?

3. Do you know for sure each line will contain the same number of values? If not, consider using an array type with flexible size.

Hope this helps as a first nudge ;)

Stefan

 

by: rstaveleyPosted on 2004-03-05 at 05:23:33ID: 10522222

There is a C++ library which handles this kind of thing very elegantly at boost (see http://www.boost.org/libs/tokenizer/ ), but I must confess that I'd probably show my failure to shrug off C and use strtok for this, which is supposed to be bad form even amongst C programmers.

If you want to be evil, and you are *not* submitting this to be judged by the powers that be, you can use strtok thus:
--------8<--------
#include <iostream>
#include <string>
#include <memory>

void process(const std::string& str);

int main()
{
      process("a: 12,0.7,12,12.5");
      process("b: text, 23, 24, 10");
}

void process(const std::string& str)
{
      std::string str_copy = str;
      std::cout << "Processing \"" << str << "\":\n";

      // Ugh... poking into a std::string... this is really evil... and may not be portable
      char *p = const_cast<char*>(str_copy.c_str());

      const char seps[] = " ,";
      for (const char *cptr = strtok(p,seps);cptr;cptr = strtok(0,seps)) {
            std::string str = cptr;
            std::cout << "\t\"" << str << "\"\n";
      }
      std::cout << '\n';
}
--------8<--------

I'm going to be flamed for suggesting this :-)

 

by: itsmeandnobodyelsePosted on 2004-03-05 at 05:41:04ID: 10522379

Shame on you, rstaveley. The hell will open and get your nasty soul.

Why not simply parse the string:

vector<string> tokens;
int pos=0;
for (int i = 0; i <= str.length(); i++)
{
     switch(str.c_str()[i])
     {
     case ':':  case ' ':  case ',':  case '\0':
         if (i > pos)
            tokens.pushback(str.substr(pos, i-pos));
         pos=i+1;
         break;
     }
}

Ok, i'll get flamed also.

Regards, Alex

 

by: stefan73Posted on 2004-03-05 at 06:33:39ID: 10522920

Why not use some inline asm?

asm volatile ("cmp %2, %%eax\n\t"
              "bz .found\n\t"
              "cmp %3, %%eax\n\t"
              "bz .found\n\t"
              "cmp %4, %%eax\n\t"
              "bnz .goaway\n"
              ".found: mov %5,%0\n"
              ".goaway:"
                : "=g" (delim_pos)
                : "a" (str.c_str()[i]), "i" (':'), "i" (' '), "i" (','), "g" (i));

*ouch*

Nooooooo, I was just fantasizing. Using C strings is the lesser evil ;-)
Stefan

 

by: rstaveleyPosted on 2004-03-05 at 07:00:13ID: 10523205

Using boost is undoubtedly the politically correct approach, but tokenising never really gets all that clean-looking in the real world. Here's my attempt at doing it with find_first_of in comparison with boost::tokenizer. Neither of them look very pretty. Alex's approach is more legible. Stefan should join me in pergatory :-)

--------8<--------
#include <iostream>
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>

void process_std(const std::string& str),process_boost(const std::string& str);

int main()
{
      process_std("a: 12,0.7,12,12.5");
      process_std("b: text, 23, 24, 10");

      process_boost("a: 12,0.7,12,12.5");
      process_boost("b: text, 23, 24, 10");
}

// Using the standard library - not great-looking
void process_std(const std::string& str)
{
      std::cout << "Tokenizing \"" << str << "\"\n";
      std::vector<std::string> tokens;
      using std::string::size_type;
      size_type start_pos = 0,end_pos;
      do {
            end_pos = str.find_first_of(": ,",start_pos);
            std::string substr(str,start_pos,end_pos-start_pos);
            if (substr.size()) {
                  std::cout << "Token \"" << substr << "\"\n";
                  tokens.push_back(substr);
            }
            start_pos = end_pos+1;
      } while (end_pos != std::string::npos);
      std::cout << '\n';
}

// Using boost's tokenizer - a bit nicer
void process_boost(const std::string& str)
{
      std::cout << "Tokenizing \"" << str << "\"\n";
      std::vector<std::string> tokens;
      typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
      boost::char_separator<char> sep(": ,");
      tokenizer tok(str,sep);
      typedef tokenizer::iterator Itr;
      for (Itr itr = tok.begin();itr != tok.end();++itr) {
            std::string substr = *itr;
            std::cout << "Token \"" << substr << "\"\n";
            tokens.push_back(substr);
      }
      std::cout << '\n';
}
--------8<--------

 

by: itsmeandnobodyelsePosted on 2004-03-05 at 07:01:05ID: 10523213

if that is assembler, i'am a pretty girl in my mid-twenties ;-)

Regards, Alex

 

by: itsmeandnobodyelsePosted on 2004-03-05 at 07:13:23ID: 10523332

As far as i know purgatory isn't infinite. So, with your first solution you still could  rise to heaven (after 5 million years, or so...).

However, that boost thing is worse and you won't get any mercy for this (it has a triple more statements than tokens!!!).

Regards, Alex

 

by: rstaveleyPosted on 2004-03-05 at 07:27:28ID: 10523468

I confess that I've yet to get much joy out of Boost. Heaven can wait.

 

by: stefan73Posted on 2004-03-06 at 01:04:55ID: 10530123

itsmeandnobodyelse,
> if that is assembler, i'am a pretty girl in my mid-twenties ;-)
that's gcc extended asm, so put on those high heels :-)

Stefan

 

by: itsmeandnobodyelsePosted on 2004-03-06 at 05:20:31ID: 10530710

Stefan,  size 11 and high red heels!!

sarahsthss, thanks for the points, but you should have honoured others too by splitting the points.

But maybe it's too hot there where they are to think of points... ;-)

Regards, Alex

 

by: rstaveleyPosted on 2004-03-06 at 18:17:33ID: 10533479

Hey, Alex, we're all suckers for high heels :-)

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...