Search for a tab delimiter in a line

Posted on 2004-04-24
Last Modified: 2010-04-01
I posted a similar question earlier, then decided I would like to search for the first tab then extract that value after that.

For example, this is the file (but with several more lines):

Test     1        A    N    testtt     12345
Test     1        A    N    testtt     12345
Test     1        A    N    testtt     12345
Test    21       A    N    testtt     12345
Test    41       A    N    testtt     12345
Test    21       A    N    testtt     12345

I need to search the 2nd column within this file.  I am reading it using getline, then I was going to use substr and specify the location, but since the 2nd field's position varies, I can't do it that way.

I was thinking about searching for the 1st tab within that file.  If found, then I could set the position to read the 2nd column (which is after the 1st tab).  
Is this possible without having to use a C function like strtok?
Question by:jewee
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
LVL 11

Assisted Solution

avizit earned 50 total points
ID: 10910388
Is the file produced by a program or edited by human ?

if  it's program it's okay to search for "\t"  but if its human edited then it might be sequence of space character and not a '\t'
so you need to take care of that .

( ps :

1)if you are not under compulsion to do it in C++ , script languages like perl etc may give you less painful solutions )
2) if you have control over the format .. i guess a more pragmatic format would be using a delimiter like ':' ( unless your data can contain a ':'  as you dont have the confusion of whether that was a tab or 4 spaces or was it 5 )

LVL 30

Assisted Solution

Axter earned 200 total points
ID: 10910649
You can use scanf or fscanf to pull the data out of a line.
LVL 30

Assisted Solution

Axter earned 200 total points
ID: 10910667
Instead of using getline function, you can just use operator >> functions for each field.
int main(int argc, char* argv[])
      ifstream file;"c:\\test2.txt");

      char Field1[33];
      int Field2;
      char Field3;
      char Field4;
      char Field5[33];
      int Field6;
            file >> Field1 >> Field2 >> Field3 >> Field4 >> Field5 >> Field6;
            if (!file.eof())
                  cout << Field1 << ", " << Field2 << ", " << Field3 << ", " << Field4 << ", " << Field5 << ", " << Field6 << endl;
      return 0;

The above code will fetch the data for each line, and will do so even if the data is seperated by tabs or spaces.
LVL 17

Accepted Solution

rstaveley earned 250 total points
ID: 10910896
You can use getline on istringstream with the '\t' delimiter, if the tab stops are guaranteed to be hard.

#include <iostream>
#include <sstream>
#include <fstream>
#include <vector>

int main()
        using std::string;
        std::ifstream fin("tab.txt");   // Your input file
        string line;
        while (getline(fin,line)) {
                std::istringstream istr(line);
                std::vector<string> tokenList(6);
                for (int i = 0;i < tokenList.size();i++)
                        if (!getline(istr,tokenList[i],'\t'))
                if (tokenList[1] == "21") // Looking for 2nd field with "21"
                        std::cout << "Value for a 21 is \"" << tokenList[5] << "\"\n";

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

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

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn additional member functions of the vector class. Specifically, the capacity and swap member functions will be introduced.

740 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