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?
jeweeAsked:
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.

i.e.:
--------8<--------
#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'))
                                break;
                if (tokenList[1] == "21") // Looking for 2nd field with "21"
                        std::cout << "Value for a 21 is \"" << tokenList[5] << "\"\n";
        }
}
--------8<--------
0
 
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 )


/abhijit/
0
 
AxterConnect With a Mentor Commented:
You can use scanf or fscanf to pull the data out of a line.
0
 
AxterConnect With a Mentor Commented:
Instead of using getline function, you can just use operator >> functions for each field.
Example:
int main(int argc, char* argv[])
{
      ifstream file;
      file.open("c:\\test2.txt");

      char Field1[33];
      int Field2;
      char Field3;
      char Field4;
      char Field5[33];
      int Field6;
      do
      {
            file >> Field1 >> Field2 >> Field3 >> Field4 >> Field5 >> Field6;
            if (!file.eof())
                  cout << Field1 << ", " << Field2 << ", " << Field3 << ", " << Field4 << ", " << Field5 << ", " << Field6 << endl;
      }while(!file.eof());
      system("pause");
      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.
0
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.