424,054 Members | 1,055 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 424,054 IT Pros & Developers. It's quick & easy.

Getting Error Text from ifstream

P: n/a
Hello group,

coming from C, I'm used to somthing like this when opening a file

const char *foobar = "this.txt";
FILE *f;
f = fopen(foobar, "r");
if (!f) {
fprintf(stderr, "Couldn't open %s: %s\n", foobar, strerror(errno));
exit(EXIT_FAILURE);
}

translating that somewhat to C++ yields me with

const char *foobar = "this.txt";
std::ifstream f(foobar);
if (!f) {
throw GenericException("Couldn't open file.");
}

So I can detect that opening the file wasn't successful, but I don't
know *why* (i.e. permissions, no such file or directory, etc.). My guess
is that strerror and errno still do what I expect them to do, however I
think that would be a very C-way to solve things.

How can I accomplish strerror(errno) on the std::ifstream with C++ means?

Greetings,
Johannes

--
"Viele der Theorien der Mathematiker sind falsch und klar
Gotteslästerlich. Ich vermute, dass diese falschen Theorien genau
deshalb so geliebt werden." -- Prophet und Visionär Hans Joss aka
HJP in de.sci.mathematik <47**********************@news.sunrise.ch>
Nov 20 '07 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On Tue, 20 Nov 2007 14:45:24 +0100 in comp.lang.c++, Johannes Bauer
<df***********@gmx.dewrote,
>So I can detect that opening the file wasn't successful, but I don't
know *why* (i.e. permissions, no such file or directory, etc.). My guess
is that strerror and errno still do what I expect them to do, however I
think that would be a very C-way to solve things.
Use strerror(), perror(), and errno and consider yourself lucky. The
C++ standard doesn't exactly promise that they will work for iostreams,
but they do for the compilers I use. That's the best you get for now.
Nov 20 '07 #2

P: n/a
David Harmon schrieb:
Use strerror(), perror(), and errno and consider yourself lucky. The
C++ standard doesn't exactly promise that they will work for iostreams,
but they do for the compilers I use. That's the best you get for now.
Oh, that's really a shame. Is anything planned about this in future
specifications?

Greetings,
Johannes

--
"Viele der Theorien der Mathematiker sind falsch und klar
Gotteslästerlich. Ich vermute, dass diese falschen Theorien genau
deshalb so geliebt werden." -- Prophet und Visionär Hans Joss aka
HJP in de.sci.mathematik <47**********************@news.sunrise.ch>
Nov 20 '07 #3

P: n/a
On Tue, 20 Nov 2007 18:23:35 +0100 in comp.lang.c++, Johannes Bauer
<df***********@gmx.dewrote,
>David Harmon schrieb:
>Use strerror(), perror(), and errno and consider yourself lucky. The
C++ standard doesn't exactly promise that they will work for iostreams,
but they do for the compilers I use. That's the best you get for now.

Oh, that's really a shame. Is anything planned about this in future
specifications?
I have not heard of any. That would be a good question for
comp.std.c++, where the c++ standardization process is discussed.
Nov 20 '07 #4

P: n/a
On Nov 20, 2:45 pm, Johannes Bauer <dfnsonfsdu...@gmx.dewrote:
coming from C, I'm used to somthing like this when opening a file
const char *foobar = "this.txt";
FILE *f;
f = fopen(foobar, "r");
if (!f) {
fprintf(stderr, "Couldn't open %s: %s\n", foobar, strerror(errno));
exit(EXIT_FAILURE);
}
translating that somewhat to C++ yields me with
const char *foobar = "this.txt";
std::ifstream f(foobar);
if (!f) {
throw GenericException("Couldn't open file.");
}
So I can detect that opening the file wasn't successful, but I
don't know *why* (i.e. permissions, no such file or directory,
etc.). My guess is that strerror and errno still do what I
expect them to do, however I think that would be a very C-way
to solve things.
It's not really a C way either, since C doesn't say anything
about the state of errno after a failed fopen.

Pragmatically, it's what I do as well.
How can I accomplish strerror(errno) on the std::ifstream with
C++ means?
You can't associate errno with an std::ifstream anymore than you
can associate it a FILE*.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique oriente objet/
Beratung in objektorientierter Datenverarbeitung
9 place Smard, 78210 St.-Cyr-l'cole, France, +33 (0)1 30 23 00 34
Nov 20 '07 #5

P: n/a
James Kanze schrieb:
It's not really a C way either, since C doesn't say anything
about the state of errno after a failed fopen.

Pragmatically, it's what I do as well.
Does it really not? My Linux manpage says its fopen implementation is in
accordance with ANSI C3.159-1989 ("ANSI C") and errno (according to
another manpage) seems to appear in the ISO-C standard - yet the
connection of the two is purely a Linux thing and could break on any
other system?
>How can I accomplish strerror(errno) on the std::ifstream with
C++ means?

You can't associate errno with an std::ifstream anymore than you
can associate it a FILE*.
This is really a lack, as I think the language should provide means for
that. Many are, in fact, operating system independent after all.

Greetings,
Johannes

--
"Viele der Theorien der Mathematiker sind falsch und klar
Gotteslästerlich. Ich vermute, dass diese falschen Theorien genau
deshalb so geliebt werden." -- Prophet und Visionär Hans Joss aka
HJP in de.sci.mathematik <47**********************@news.sunrise.ch>
Nov 20 '07 #6

This discussion thread is closed

Replies have been disabled for this discussion.