Search for a tab delimiter in a line

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?
Who is Participating?
rstaveleyConnect With a Mentor Commented:
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";
avizitConnect With a Mentor Commented:
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 )

AxterConnect With a Mentor Commented:
You can use scanf or fscanf to pull the data out of a line.
AxterConnect With a Mentor Commented:
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.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.