Solved

How Do I  Read Text File into Array using C++

Posted on 2009-07-09
15
707 Views
Last Modified: 2012-05-07
Im really unfamiliar with C++ so need some help. Can someone post the exact code that will do the following;

I have a  text file called "C:\\bob.txt"

It contains 256 rows of 3 digits (separated by a space). ie. the first 3 lines are

33 47 50
12 88 99
44 90 23

Each number contains a maximum of 3 digits.
 
Each row represents a colour in RGB format. ie 1st number is red, 2nd number is green, 3rd number is blue.

I want to read the text file into an array of Color. Something along the lines of;

Color myColorArray = new Color[256];

Then you would use a loop and add each line of 3 digits (representing a color) to the array. ie.

Color col  = Color::FromArgb(r,g,b);

then add col to the array


So basically I need to read the text file and add each line that represents a color to an array of Color.
Can someone post the exact code that would do this?

Thanks
0
Comment
Question by:rangers99
[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
  • 5
  • 4
  • +1
15 Comments
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24812059
Something like the below?
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;
 
 
...
ifstream ifs("bob.txt");
string line;
vector<Color> colors;
while (getline(ifs, line))
{
    istringstream iss(line);
    Color c = { 0 };
    if (!iss >> c.red) continue;
    if (!iss >> c.green) continue;
    if (!iss >> c.blue) continue;
    colors.push_back(c);
}
ifs.close();

Open in new window

0
 
LVL 40

Expert Comment

by:evilrix
ID: 24812097
http://www.cplusplus.com/reference/algorithm/copy/
http://www.cplusplus.com/reference/stl/vector/
http://www.cplusplus.com/reference/std/iterator/istream_iterator/
http://www.cplusplus.com/reference/iostream/fstream/
http://www.cplusplus.com/reference/iostream/stringstream/
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
 
struct Color // Dummy
{
   Color(int r, int g, int b)
      :r(r), g(g), b(b)
   {}
 
   int r;
   int g;
   int b;
};
 
int main()
{
   // For test purposes I use a stringstream you can swap this for
   // a fstream to read the same data from file, interfaces are identical
   std::stringstream ifs("33 47 50\n12 88 99\n 44 90 23");
 
   std::string sLine;
   std::vector<int> v(3);
   std::vector<Color> colors;
 
   while(std::getline(ifs, sLine))
   {
      std::stringstream ss(sLine);
      std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), v.begin());
 
      colors.push_back(Color(v[0], v[1], v[2]));
   }
}

Open in new window

0
 

Author Comment

by:rangers99
ID: 24812106
Hi
Did that code compile OK?
I tried pasting that into my code but Im getting several compiler errors.
0
Technology Partners: 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!

 

Author Comment

by:rangers99
ID: 24812112
Sorry my above comment was for "itsmeandnobodyelse"
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24812113
>> Did that code compile OK?
Me or Alex?

Me -- yes, of course :)
0
 
LVL 53

Expert Comment

by:Infinity08
ID: 24812121
>>     if (!iss >> c.red) continue;

Be careful with operator precedence. This does something entirely different than what you intended, since the negation operator (!) has higher precedence than the bit-leftshift operator (<<). You should add ()'s :

        if (!(iss >> c.red)) continue;
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24812140
>>>> Did that code compile OK?
Hmmm, I made some "..." which probably won't compile.

also the code below the includes should be moved to a function or to your main.

Then I assumed Color struct has members red, green, blue. If it is not or if it is r,g,b  you would need to change it.

Best, you post the struct definition of Color and I could test it on my system.
0
 

Author Comment

by:rangers99
ID: 24812143
evilrix
The Color struct you have defined clashes with the Color class
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24812148
>>>> if (!(iss >> c.red)) continue;
Thanks, Infinity. I recognized it after posting.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24812151
>> The Color struct you have defined clashes with the Color class
It's for example purposes only... that's why it says Dummy next to it. I am not compiling this on Windows so it is meant to represent your Color class.
0
 
LVL 40

Expert Comment

by:evilrix
ID: 24812156
>> I am not compiling this on Windows so it is meant to represent your Color class.
In other words swap it out for your class.
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24812163
>>>> Me -- yes, of course :)
>>>> I am not compiling this on Windows

yes, of course ;-)
0
 
LVL 40

Accepted Solution

by:
evilrix earned 250 total points
ID: 24812178
Just noticed you need to use FromArgb... code modified to suit.

>>> colors.push_back(Color::FromArgb(v[0], v[1], v[2])); <<<

NB. Again, Color is a dummy class since I don't have Windows... just remove it and use your own class.
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
 
struct Color // Dummy
{
   Color(int r, int g, int b)
      :r(r), g(g), b(b)
   {}
 
   static Color FromArgb(int r, int g, int b)
   {
      return Color(r,g,b);
   }
 
   int r;
   int g;
   int b;
};
 
int main()
{
   // For test purposes I use a stringstream you can swap this for
   // a fstream to read the same data from file, interfaces are identical
   std::stringstream ifs("33 47 50\n12 88 99\n 44 90 23");
 
   std::string sLine;
   std::vector<int> v(3);
   std::vector<Color> colors;
 
   while(std::getline(ifs, sLine))
   {
      std::stringstream ss(sLine);
      std::copy(std::istream_iterator<int>(ss), std::istream_iterator<int>(), v.begin());
 
      colors.push_back(Color::FromArgb(v[0], v[1], v[2]));
   }
}

Open in new window

0
 

Author Closing Comment

by:rangers99
ID: 31601504
Thanks thats done it. cheers.
0
 
LVL 39

Expert Comment

by:itsmeandnobodyelse
ID: 24812223
The below compiles on my compiler.

I will test later.
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
using namespace std;
 
/*  it is only for my test 
    you should use your Color structure
 
struct Color
{
   int r, g, b;
   static Color FromArgb(int red, int green, int blue)
   {
      Color c = { 0 };    
      c.r = red; c.g = green; c.b = blue;
      return c;
   }
};
*/
 
bool getColors(vector<Color>& colors)
{
   ifstream ifs("bob.txt");
   string line;
   while (getline(ifs, line))
   {
       istringstream iss(line);
       int red = 0, green = 0, blue = 0;
       if (!(iss >> red)) continue;
       if (!(iss >> green)) continue;
       if (!(iss >> blue)) continue;
       // Hope FromArgb was no typo
       Color c = Color::FromArgb(red, green, blue);
       colors.push_back(c);
   }
   ifs.close();
   return colors.size() != 0;
}
 
int main(void) 
{
   vector<Color> colors;
   if (getColors(colors))
   {
      // here you can use the array
   }
   return 0;
}
 

Open in new window

0

Featured Post

Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say 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

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…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.
The viewer will learn how to pass data into a function in C++. This is one step further in using functions. Instead of only printing text onto the console, the function will be able to perform calculations with argumentents given by the user.

752 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