Solved

Fetch Content of the file

Posted on 2004-10-14
15
207 Views
Last Modified: 2010-04-01
this is my reference
i asked s..t yesterday, and this prob is associated with that prob
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_21167966.html

in that post.
i say that i only have one line ...
says now , i have multiline of that.
can any one suggest me the best way to store them.

i thinking of multidimension array.
and vector. in the case of vector , i think i need to read in each array first and then store each into the vector. is that a good idea?

however, i don't have experience w/ vector before.
can any1 help me a bit of this?


Thx a lot
Tom
0
Comment
Question by:tom_mk
[X]
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
  • 5
  • 4
  • 3
15 Comments
 

Expert Comment

by:pcxboy
ID: 12313509
could you clarify exactly what it is you are trying to do? I'm taking Data Structures right now, and Ive dealt with this before.
0
 

Author Comment

by:tom_mk
ID: 12313979
1.0 2.0 1.0 10 20 10 10 -20 10 10 10 20 0 20 10 -10 50 -40 50 10
2.0 2.0 1.0 10 20 10 10 -20 10 10 10 20 0 20 10 -10 50 -40 50 10
3.0 2.0 1.0 10 20 10 10 -20 10 10 10 20 0 20 10 -10 50 -40 50 10

is my file
i wanna each line into my program
so that i can use one of the value in each line directly

thx
TOm
0
 

Expert Comment

by:pcxboy
ID: 12314751
Do you want each seperate number, or each seperate line? If you want each seperate line, here is some code:

//This opens up the file, and gives the object that handles that file the name of READER
std::ifstream READER("WHATEVER THE NAME OF YOUR FILE IS");                

//This stores each line
std::string lines;

//This creates a vector of strings, and calls it line_holder
std::vector<std::string> line_holder;

//This reads each line from your file (READER) and puts it inside the std::string lines. It will terminate once there are no more lines to get from the file
while(std::getline(READER,lines))
{
  //This puts each line into the vector.
  line_holder.push_back(lines);
}

If you want to get each individual number, then let me know.

Mike
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Expert Comment

by:pcxboy
ID: 12314867
Here is some code if you want each number, instead of each line:

std::ifstream READER("WHATEVER THE NAME OF YOUR FILE IS");              

std::string lines;

std::vector<std::string> lines_holder;

while(READER>>lines)
{
  lines_holder.push_back(lines);
}

If you want the ACTUAL numbers, and not just strings, then try this code:

std::ifstream READER("WHATEVER THE NAME OF YOUR FILE IS");              

std::string lines;

//This is a double to handle the negative numbers and the decimal numbers
std::vector<double> number_holder;

while(READER>>lines)
{
 //Creates a string-stream object. This can convert between different data types, depending on what the data types are
 std::sstream convert;

// A Temporary double object to store each number from your file as it comes in.
 double temp;

//Shoves the string from the file into the string-stream
 convert << lines;

//Shoves it right back into the temporary double object, onverting it to a double
 convert >> temp;
 number_holder.push_back(temp);
}

Again, if this isnt what youre looking for, please let me know.

Mike
0
 
LVL 12

Expert Comment

by:OnegaZhang
ID: 12315102
#include <fstream>
#include <string>
#include <deque>
#include <iomanip>
#include <iostream>
#include <stdlib.h>
#include <sstream>
int parse_line(std::string line, std::deque<float> &que)
{
      //return number of float parsed from the line
      int existing  = que.size();
      std::string separators = " ";
          int n = line.length();
          int start, stop;
      std::stringstream oss;
          start = line.find_first_not_of(separators);
          while ((start >= 0) && (start < n))
      {
             stop = line.find_first_of(separators, start);
             if ((stop < 0) || (stop > n))
                     stop = n;
            std::string field = line.substr(start, stop - start);
            std::stringstream oss;
            oss<<field;
            float val = 0;
            oss>>val;
             que.push_back(val);
             start = line.find_first_not_of(separators, stop+1);
       }
      int nret = que.size() - existing;      
      std::cout<<line<<"  values in line:"<<nret<<std::endl;
      return nret;
}
int main()
{
      std::ifstream input("C:\\test\\aaa\\input.txt");
      std::deque<std::string> lines;
      std::string line;
      std::deque<float> values;
      while(getline(input,line))
            {
            lines.push_back(line);
            parse_line(line,values);
            }
      int index = 0;
      for(std::deque<float>::const_iterator it = values.begin();
      it!=values.end();
      it++)
            {
            std::cout<<std::setw(4)<<std::setfill(' ')<<*it;
            index++;
            if(index%20 == 0)
                  std::cout<<std::endl;
            }
      std::cout<<"total values:"<<values.size()<<std::endl;
}

/*
   g++ -c parse.cpp
   g++ -o parse parse.o

    welcome to www.fruitfruit.com
*/
0
 

Author Comment

by:tom_mk
ID: 12315889
onegaZHang,

i not kinda understnad how to get the value out .
 (pls c the example of my txt file above)

says i wanna get the value '-40' out from the line begins with 1.0

how can i get tat?
0
 
LVL 12

Expert Comment

by:OnegaZhang
ID: 12316190
//deque is similar to an array

#include <fstream>
#include <string>
#include <deque>
#include <iomanip>
#include <iostream>
#include <sstream>
int parse_line(std::string line, std::deque<float> &que)
{
      //return number of float parsed from the line
      int existing  = que.size();
      std::string separators = " ";
          int n = line.length();
          int start, stop;
      std::stringstream oss;
          start = line.find_first_not_of(separators);
          while ((start >= 0) && (start < n))
      {
             stop = line.find_first_of(separators, start);
             if ((stop < 0) || (stop > n))
                     stop = n;
            std::string field = line.substr(start, stop - start);
            std::stringstream oss;
            oss<<field;
            float val = 0;
            oss>>val;
             que.push_back(val);
             start = line.find_first_not_of(separators, stop+1);
       }
      int nret = que.size() - existing;      
      std::cout<<line<<"  values in line:"<<nret<<std::endl;
      return nret;
}
int main()
{
      std::ifstream input("C:\\test\\aaa\\input.txt");
      std::deque<std::string> lines;
      std::string line;
      std::deque<float> values;
      int fields_per_row = 0;
      while(getline(input,line))
            {
            lines.push_back(line);
            fields_per_row = parse_line(line,values);
            }
      int index = 0;
      for(std::deque<float>::const_iterator it = values.begin();
      it!=values.end();
      it++)
            {
            std::cout<<std::setw(4)<<std::setfill(' ')<<*it;
            index++;
            if(index%20 == 0)
                  std::cout<<std::endl;
            }
      std::cout<<"total values:"<<values.size()<<std::endl;
      int line_count = lines.size();
      for(int i=0;i<line_count;i++)
            {
            //line = lines[i];
            if(values[i*fields_per_row] == 1.0)
                  {
                  //found the line start with 1.0
                  for(int y=0;y<fields_per_row;y++)
                        {
                        if(values[i*fields_per_row+y] == -40)
                              {
                              //find value 40
                              std::cout<<"the value was found in line "<<i<<" column "<<(y+1)<<std::endl;
                              break;
                              }                        
                        }
                  break;
                  }
            }
}

/*
   g++ -c parse.cpp
   g++ -o parse parse.o

    welcome to www.fruitfruit.com
*/
0
 

Author Comment

by:tom_mk
ID: 12316222
OnegaZhang

the one u doing is.  read eachline into array.
and put all array into queue ?

rgiht?
0
 

Author Comment

by:tom_mk
ID: 12316274
can s.o help me ?

i want to use vector to staore each array. which each array consistf of number from a line

Thx
TOm
0
 
LVL 12

Expert Comment

by:OnegaZhang
ID: 12316637
#include <fstream>
#include <string>
#include <deque>
#include <iomanip>
#include <iostream>
#include <vector>
#include <sstream>

template<typename T>
int parse_line(std::string line, T& que)
{
      //return number of float parsed from the line
      int existing  = que.size();
      std::string separators = " ";
          int n = line.length();
          int start, stop;
          start = line.find_first_not_of(separators);
          int field_index = 0;
          while ((start >= 0) && (start < n))
      {
             stop = line.find_first_of(separators, start);
             if ((stop < 0) || (stop > n))
                     stop = n;
            std::string field = line.substr(start, stop - start);
            std::stringstream oss;
            oss<<field;
            float val = 0;
            oss>>val;
             que[field_index] = (val);
             field_index++;
             start = line.find_first_not_of(separators, stop+1);
       }
      int nret = field_index;
      return nret;
}
int main()
{
      std::ifstream input("C:\\test\\aaa\\input.txt");
      std::deque<std::string> lines;
      std::string line;
      int fields_per_row = 0;
      bool bfound = false;
      while(getline(input,line) && bfound==false)
            {
                lines.push_back(line);
                std::vector<float> valarray(100);
                fields_per_row = parse_line(line,valarray);
                if(valarray[0] == 1.0 ) //find the line start with 1.0
                {//be careful to compare floating point number, should not use ==
                    for(int i=0;i<fields_per_row;i++)
                    {
                        if(valarray[i] == -40)
                        {
                            bfound = true;
                            std::cout<<"fount -40 in line "<<lines.size()<<" at column "<<(1+i)<<std::endl;
                            break;
                        }    
                    }  
                }  
            }
            system("PAUSE");
}

/*
   g++ -c parse.cpp
   g++ -o parse parse.o

    welcome to www.fruitfruit.com
*/
0
 

Author Comment

by:tom_mk
ID: 12316835
is there any easier code than this?

thx again .
tom
0
 
LVL 12

Accepted Solution

by:
OnegaZhang earned 500 total points
ID: 12332133
parse_line parse a string into an array of values,
while(getline(input,line) && bfound==false) // read all lines from a file
 if(valarray[0] == 1.0 ) //find the line start with 1.0
                  for(int i=0;i<fields_per_row;i++)
                  {
                      if(valarray[i] == -40) // find the position of -40
                      {
                          bfound = true;
                          std::cout<<"fount -40 in line "<<lines.size()<<" at column "<<(1+i)<<std::endl;
                          break;
                      }    
                  }  
It is pure C++, not too complicated:-)
welcome to www.fruitfruit.com
0

Featured Post

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
Fully specialized class template function 21 157
mixing C++ & C# in Vis Studio 2013 7 280
Outlook 13 100
cmake and message 1 22
Introduction This article is the first in a series of articles about the C/C++ Visual Studio Express debugger.  It provides a quick start guide in using the debugger. Part 2 focuses on additional topics in breakpoints.  Lastly, Part 3 focuses on th…
Container Orchestration platforms empower organizations to scale their apps at an exceptional rate. This is the reason numerous innovation-driven companies are moving apps to an appropriated datacenter wide platform that empowers them to scale at a …
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

734 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