We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

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

rangers99
rangers99 asked
on
Medium Priority
732 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
Comment
Watch Question

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

evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
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

Author

Commented:
Hi
Did that code compile OK?
I tried pasting that into my code but Im getting several compiler errors.

Author

Commented:
Sorry my above comment was for "itsmeandnobodyelse"
evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
>> Did that code compile OK?
Me or Alex?

Me -- yes, of course :)
CERTIFIED EXPERT
Top Expert 2009

Commented:
>>     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;
>>>> 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.

Author

Commented:
evilrix
The Color struct you have defined clashes with the Color class
>>>> if (!(iss >> c.red)) continue;
Thanks, Infinity. I recognized it after posting.
evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
>> 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.
evilrixSenior Software Engineer (Avast)
CERTIFIED EXPERT

Commented:
>> 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.
>>>> Me -- yes, of course :)
>>>> I am not compiling this on Windows

yes, of course ;-)
Senior Software Engineer (Avast)
CERTIFIED EXPERT
Commented:
Unlock this solution with a free trial preview.
(No credit card required)
Get Preview

Author

Commented:
Thanks thats done it. cheers.
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

Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a free trial preview!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.