Re: ifstream question
(Top-posting hated,
bottom-posting proper;
where fits "middle-posting" ? (*grin*)
See below)
"Jerry Coffin" <jcoffin@taeus.com> wrote in message
news:MPG.220afb53b9b50afc989b95@news.sunsite.dk...
In article <3t6oj.21$az7.5@newsfe07.lga>, jgbrawley@charter.net says...
[ ... ]
BUT: O, beautiful synergy: as it happens, the first file line's three
numbers (the rest have five) are not intended to go into my x,y,z,r,c
database, so all I had to do was read these three and their two char > >
commas (but _not_ read the newline) _outside_ of the loop, which then > >
the loop exactly what it expected (a char first --the \n-- in the loop-
[...]
here (you included) didn't see what sheer idiocy I had perpetrated
upon myself. (*grin*)
I wouldn't be quite so hard on yourself -- things like this really can
be a pain for almost anybody to get right.
There are other ways that can be a bit easier though. For one example,
when you read numbers from a stream, the stream uses a locale to
actually read the numbers, as well as to classify the other characters
that get read from the stream. When you read numbers, it treats white-
space as delimiters between the numbers -- e.g. if you started with a
file like:
Apart from the excellence of your info useful to many others no doubt, I
didn't know it'd be a 'standard' phenomenon that whitespaces would be
ignored in a program process with streams in C++. I know C++ ignores them
in a .cpp file to be compiled but it would not have occured to me that this
could be the case also within how a compiled .exe treats the stream.
That gives me a major reason to perhaps alter my file _writers_ to record
data in space-dlimited format instead of comma-delimited, which I'd been
resisting since the preceding Python version of this uses the
comma-delimited form.
As to your code (left in below), that's where others will benefit. It's
flat-out beyond my understanding. I haven't even figured out how to write a
class, just barely managed recently to get a few functions to work.
(Compiler laughs at me, says mine are an outmoded form --they look like
Python functions--but grudgingly compiles the program anyway...)
I appreciate the effort and idea, but that's a lot more code (even if I
understood it) than I want to have to do, just to deal with the commas (and
the newlines), when the "wrong" way (fooling the typed infile>> function
into doing what I want it to, without writing a purposeful fooler like this)
works perfectly with a tenth of the code.
I've said in another thread that I'm not a programmer. I'm _not_ a
programmer. I'm just a man who has no choice but to do one thing one time
in code so it will run on a computer (a model of something), and who has no
choice but to now use C++ to gain the sheer speed advantage over Python.
(The program is 95% continuous pure number-crunching; hopes for very large
data sets.)
Thanks for the info and sentiments. I do appreciate them.
1 2 3 4 5
instead of:
1,2,3,4,5
it would have skipped the white-space automatically, and just read
numbers.
That leads to a fairly simple (if somewhat oddball) solution: create a
locale that says ',' is a whitespace character, and then tell the stream
to use that locale:
class my_ctype : public std::ctype<char> {
mask my_table[UCHAR_MAX];
public:
my_ctype(size_t refs = 0)
: std::ctype<char>(my_table, false, refs)
{
// copy the normal character class table, so ' ', tab, etc., are still
// white space
std::copy(classic_table(),
classic_table() + table_size,
my_table);
// for our purposes, comma is also white space.
my_table[','] = (mask)space;
}
};
int add(int a, int b) { return a+b; }
int main() {
// create a locale that includes our ctype:
std::locale x(std::locale::classic(), new my_ctype);
// and tell cin to use the new locale:
std::cin.imbue(x);
// now we'll read numbers from standard input into a vector
std::vector<int> numbers;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(numbers));
// print out the numbers:
std::copy(numbers.begin(), numbers.end(),
std::ostream_iterator<int>(std::cout, "\n"));
std::cout << "\n";
// add numbers to show they really are numbers:
std::cout << std::accumulate(numbers.begin(), numbers.end(),
0, add);
return 0;
}
input:
1,2,3,4,5
output:
1
2
3
4
5
15
--
Later,
Jerry.
Thank you very much.
--
Peace
JB
jb@tetrahedraverse.com
Web: http://tetrahedraverse.com