M
ma740988
Consider:
ifstrem MyFile("extractMe.txt");
string Str;
getline(MyFile, Str);
getline above extracts the contents of MyFile and place into the
string object. Deduced using FROM/TO logic I could state getline's
first parameter supports "FROM". The second parameter supports "TO".
// later
istringstream Stream(Str);
const int MAX(100);
char buf[MAX];
Stream.getline(buf, MAX);
Here getline extracts up to MAX the contents of the Stream and place
into buf. Except, with regards to the first/second parameters my FROM
-> TO logic doesn't make sense.
When viewed from a parameter perspective, it appears to me that theres
differing views to getline. Yes/No?
//////////////////////////// Question 2 ////////////////////////////
For test purposes the contents of a file I'm interested in reading are
as follows:
Australia
5E56,7667230284,Langler,Tyson,31.2147,0.00042117361
2B97,7586701,Oneill,Zeke,553.429,0.0074673053156065
France
// etc
The struct UserInfo (below) is used to describe the data. So now
Australia, represents the region, 5E56 represents the seller id,
7667230284 represents the phone number and so on.
struct UserInfo
{
string Region;
string SellerId;
double PhoneNum; //Phone number too large for an int.
string LastName;
string FirstName;
double TotalSales;
double AmountTotalSales;
};
#if 0
std:stream& operator << ( std:stream& Out, const
std::vector<UserInfo>& V )
{
std::vector<UserInfo>::const_iterator Pos = V.begin();
for( Pos; Pos != V.end(); ++Pos )
Out << Pos->AmountTotalSales; // Test
return Out;
}
#endif
int main()
{
ifstream File("exercise15.txt");
if (!File.is_open())
{
cerr << " error opening file ";
exit(1);
}
string Str;
vector<UserInfo> info;
UserInfo userInfo;
while (getline(File, Str))
{
std::istringstream Stream(Str);
string::size_type Idx = Str.find(',');
if (Idx == string::npos)
{
Stream >> userInfo.Region;
//cout << userInfo.Region << '\n';
}
else
{
char comma;
getline(Stream, userInfo.SellerId, ',');
Stream >> userInfo.PhoneNum >> comma;
getline(Stream, userInfo.LastName, ',');
getline(Stream, userInfo.FirstName, ',');
Stream >> userInfo.TotalSales >> comma;
Stream >> userInfo.AmountTotalSales >> comma;
#if 0
cout << userInfo.SellerId << '\n';
cout << userInfo.PhoneNum << '\n';
cout << userInfo.LastName << '\n';
cout << userInfo.FirstName << '\n';
cout << userInfo.TotalSales << '\n';
cout << userInfo.AmountTotalSales << '\n';
cout << '\n';
#endif
}
info.push_back(userInfo);
}
File.close();
}
Works. Now, I need to print the data in a specific format. i.e
Australia
-------------------------------------------------------------------------------
SellerId Phone Number Last Name First Name Total Sales Amount
Total
24150 (766)723-0284 Langler Tyson 31.2147
0.00042117361
The question. Would overloading the operator << be the most viable
approach?
Comments on my approach in extracting the data is also welcome.
Note: I've seen - for my level - some sophisticated approaches
(facets, locales, copying classic_tables etc ) to handling delimited
streams. I was opting to use one of them but I figured I'll try to
walk first before I run - so to speak.
Thanks in advance.
ifstrem MyFile("extractMe.txt");
string Str;
getline(MyFile, Str);
getline above extracts the contents of MyFile and place into the
string object. Deduced using FROM/TO logic I could state getline's
first parameter supports "FROM". The second parameter supports "TO".
// later
istringstream Stream(Str);
const int MAX(100);
char buf[MAX];
Stream.getline(buf, MAX);
Here getline extracts up to MAX the contents of the Stream and place
into buf. Except, with regards to the first/second parameters my FROM
-> TO logic doesn't make sense.
When viewed from a parameter perspective, it appears to me that theres
differing views to getline. Yes/No?
//////////////////////////// Question 2 ////////////////////////////
For test purposes the contents of a file I'm interested in reading are
as follows:
Australia
5E56,7667230284,Langler,Tyson,31.2147,0.00042117361
2B97,7586701,Oneill,Zeke,553.429,0.0074673053156065
France
// etc
The struct UserInfo (below) is used to describe the data. So now
Australia, represents the region, 5E56 represents the seller id,
7667230284 represents the phone number and so on.
struct UserInfo
{
string Region;
string SellerId;
double PhoneNum; //Phone number too large for an int.
string LastName;
string FirstName;
double TotalSales;
double AmountTotalSales;
};
#if 0
std:stream& operator << ( std:stream& Out, const
std::vector<UserInfo>& V )
{
std::vector<UserInfo>::const_iterator Pos = V.begin();
for( Pos; Pos != V.end(); ++Pos )
Out << Pos->AmountTotalSales; // Test
return Out;
}
#endif
int main()
{
ifstream File("exercise15.txt");
if (!File.is_open())
{
cerr << " error opening file ";
exit(1);
}
string Str;
vector<UserInfo> info;
UserInfo userInfo;
while (getline(File, Str))
{
std::istringstream Stream(Str);
string::size_type Idx = Str.find(',');
if (Idx == string::npos)
{
Stream >> userInfo.Region;
//cout << userInfo.Region << '\n';
}
else
{
char comma;
getline(Stream, userInfo.SellerId, ',');
Stream >> userInfo.PhoneNum >> comma;
getline(Stream, userInfo.LastName, ',');
getline(Stream, userInfo.FirstName, ',');
Stream >> userInfo.TotalSales >> comma;
Stream >> userInfo.AmountTotalSales >> comma;
#if 0
cout << userInfo.SellerId << '\n';
cout << userInfo.PhoneNum << '\n';
cout << userInfo.LastName << '\n';
cout << userInfo.FirstName << '\n';
cout << userInfo.TotalSales << '\n';
cout << userInfo.AmountTotalSales << '\n';
cout << '\n';
#endif
}
info.push_back(userInfo);
}
File.close();
}
Works. Now, I need to print the data in a specific format. i.e
Australia
-------------------------------------------------------------------------------
SellerId Phone Number Last Name First Name Total Sales Amount
Total
24150 (766)723-0284 Langler Tyson 31.2147
0.00042117361
The question. Would overloading the operator << be the most viable
approach?
Comments on my approach in extracting the data is also welcome.
Note: I've seen - for my level - some sophisticated approaches
(facets, locales, copying classic_tables etc ) to handling delimited
streams. I was opting to use one of them but I figured I'll try to
walk first before I run - so to speak.
Thanks in advance.