10

I have a dat file like this

AAAA     1861    9   7   0.00    -1.50   -19.50      9999.00     9999.00     9999.00     9999.00     18.20   9999.00     6.70    135.00      8.00    9999.00     9999.00     9999.00     9999    0   193        250180280600000000 
BBBBBBBBB    1861    9   7   0.00    -7.50   36.50   9999.00     9999.00     21.40   1018.10     22.60   9999.00     1.00    68.00   2.00    9999.00     9999.00     9999.00     9999    0   193        451720280600000000 
VVVVVVVVV    1861    9   7   0.00    -58.50      10.50   9999.00     9999.00     27.50   9999.00     26.90   9999.00     15.40   45.00   6.00    9999.00     9999.00     9999.00     9999    0   193        357610280600000000 
SSSSSSSS     1861    9   7   0.00    117.50      13.50   9999.00     9999.00     28.00   1010.30     28.00   9999.00     4.60    158.00      5.00    9999.00     9999.00     9999.00     9999    0   193        370170280600000000 
DD   1861    9   7   1.00    -19.50      6.50    9999.00     9999.00     24.70   1014.80     25.30   9999.00     6.70    203.00      2.00    9999.00     9999.00     9999.00     9999    0   193        343600280600000000 
E    1861    9   7   1.00    44.50   -28.50      9999.00     9999.00     20.40   9999.00     19.00   9999.00     2.60    135.00      2.00    9999.00     9999.00     9999.00     9999    0   193        218240280600000000 
ZZZZZZZZZZZZ     1861    9   7   1.00    -15.50      38.50   9999.00     9999.00     22.00   9999.00     21.90   9999.00     6.70    68.00   2.00    9999.00     9999.00     9999.00     9999    0   193        458840280600000000 

and I would like to store the first column of the file in a vector of strings. Any idea?

This is what I tried

for(int k=0;k<ROW;k++){
   INNA >> ID;                      
   for(int j=1;j<=COL;j++) INNA >> discardID; 
   IDname[k]= ID;
} 

but in ID I then have all the columns as a unique string..

Many thanks

2
  • 1
    What have you tried? Where did it go wrong? What research have you done? Please read up on asking questions before you post here. Commented Aug 6, 2014 at 16:45
  • 1
    What is the question? Simple read the file line by line, split the line and get the first item Commented Aug 6, 2014 at 16:46

3 Answers 3

12

This is how I would solve it:

#include <fstream>
#include <strtk.hpp>   // http://www.partow.net/programming/strtk


std::string filename("your_input_data.txt");

// assuming the file is text
std::fstream fs;
fs.open(filename.c_str(), std::ios::in);

if(fs.fail())  return false;   

const char *whitespace    = " \t\r\n\f";

std::string keyword;
std::vector<float> floats;
std::vector<string> keywords;

// process each line in turn
while( std::getline(fs, line ) )
{

// remove beginnning and ending whitespace
// can prevent parsing problems
// from different line endings.
strtk::remove_leading_trailing(whitespace, line);

    // strtk::parse combines multiple delimeters in these cases

    if( strtk::parse(line, whitespace, keyword, floats ) ) 
    {
         std::cout << "succeed" << std::endl;
     // keyword contains the string and the rest of the values
     // are placed in the floats vector
     keywords.push_back( keyword );

     // you can also process the numbers
    }

}
Sign up to request clarification or add additional context in comments.

Comments

2

Read the whole line then get the first column.

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

std::vector<std::string> vec;
std::string line;
while (std::getline(std::cin, line)) {
    std::istringstream strm(line);
    std::string firstcol;
    strm >> firstcol;
    vec.push_back(firstcol);
}

Comments

0

Or in C, you could read in just the first column and discard the remaining. Something like this:

#include <stdio.h>
#include <malloc.h>
#include <string.h>

int main( )
{
    FILE * fp = NULL;
    fp = fopen("filename", "r");

    if (!fp)
        return -1;

    char buffer[256];
    char ** IDname = NULL;
    int idcount = 0;
    while (fscanf(fp, "%s %*[^\n]", buffer) == 1)
    {
        idcount++;
        IDname = realloc(IDname, idcount * sizeof * IDname);
        IDname[idcount - 1] = strdup(buffer);
    }

    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.