468,107 Members | 1,462 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,107 developers. It's quick & easy.

Reading from a text file that also is binary

Regarding the following code i have a problem.

void read () {
fstream file;
ios::open_mode opMode = ios::in;
file.open ("some.txt", opMode);
char *ch = new char[1];
vector <charv;
while (!file.eof ()) {
do {
file.read (ch, 1);
v.push_back (*ch);
}
while ((int)ch[0] != 10 || file.eof ());
}
file.close ();
}

For some reason, one that i don't comprehend, i get through
the inner while-loop three times (as suppsed to) but then, i
get stuck and the computer does not see the end of the file.

Contents of the file are three lines of normal text and then
a double saved binary.

Any thoughts? My guess is that it's perhaps due to that i
didn't open the file binary but does it really matter to
recognizing "the end"? How can i "switch" the openess
of the file?

Yes, the file _IS_ supposed to have a leading few lines of
normal text and then a bunch of binary data. Sad but true...
--
Vänligen Kerstin Viltersten
(The Cool Giraffe)
Jun 11 '07 #1
3 2476
The Cool Giraffe wrote:
Regarding the following code i have a problem.

void read () {
fstream file;
ios::open_mode opMode = ios::in;
file.open ("some.txt", opMode);
If you expect *ANY* binary data in the file you must open it in binary
mode. This means that you will get platform specific line endings which
means you need to parse them.

x '\n' x - is a unix newline
x '\r' '\n' x - is a windows newline
x '\r' x - I think (not sure) is a MAC newline.

Basically eat up at most one \n and \r and then send back a newline.
char *ch = new char[1];
char ch[1] not good enough ? Or just plain char ch ?
vector <charv;
while (!file.eof ()) {
do {
file.read (ch, 1);
v.push_back (*ch);
}
while ((int)ch[0] != 10 || file.eof ());
Should that not be ! file.eof() ?
}
file.close ();
}
Jun 11 '07 #2
Gianni Mariani wrote/skrev/kaita/popisal/schreibt :
The Cool Giraffe wrote:
>Regarding the following code i have a problem.

void read () {
fstream file;
ios::open_mode opMode = ios::in;
file.open ("some.txt", opMode);

If you expect *ANY* binary data in the file you must open it in binary
mode. This means that you will get platform specific line endings
which means you need to parse them.

x '\n' x - is a unix newline
x '\r' '\n' x - is a windows newline
x '\r' x - I think (not sure) is a MAC newline.
I tried with '\n' on the WinXP i'm on and it worked too. Should i
thank the nice employers of mr. Gates for this feature or should
i duck preparing for further issues if i keep using '\n'?
Basically eat up at most one \n and \r and then send back a newline.
> char *ch = new char[1];

char ch[1] not good enough ? Or just plain char ch ?
> vector <charv;
while (!file.eof ()) {
do {
file.read (ch, 1);
v.push_back (*ch);
}
while ((int)ch[0] != 10 || file.eof ());

Should that not be ! file.eof() ?
Actually, not quite. It took my a while but i finally realized that
not only the negation was needed (as you suggested) but also
conjunction, instead of disjunction.

--
Vänligen Kerstin Viltersten
(The Cool Giraffe)
Jun 11 '07 #3
On Jun 11, 11:09 am, "The Cool Giraffe" <giraf...@viltersten.com>
wrote:
Regarding the following code i have a problem.
I'm not sure what you're trying to do, but this is certainly
wrong. (In general, anytime you use istream::eof() in the
control of a loop, it's wrong.)
void read () {
fstream file;
ios::open_mode opMode = ios::in;
file.open ("some.txt", opMode);
char *ch = new char[1];
vector <charv;
while (!file.eof ()) {
do {
file.read (ch, 1);
v.push_back (*ch);
Note that if you are at EOF, and the read fails, then you will
push back the previously read character.
}
while ((int)ch[0] != 10 || file.eof ());
You want to loop if you've seen EOF? (And what on earth is 10.)

What I suspect you want is something like:

char ch ;
while ( file.get( ch ) && ch != '\n' ) {
v.push_back( ch ) ;
}

This will read all of the characters up to the first '\n',
inserting them into the vector, and then leave the file
positionned after the '\n'.
}
file.close ();
}
For some reason, one that i don't comprehend, i get through
the inner while-loop three times (as suppsed to) but then, i
get stuck and the computer does not see the end of the file.
Once you reach end of file, the nested loop is infinite.
Contents of the file are three lines of normal text and then
a double saved binary.
Which means that you must open the file in binary, and that you
don't expect EOF when reading the three lines. I'd do something
like:

std::vector< std::string lines ;
std::string thisLine ;
char ch ;
while ( lines.size() != 3 && file.get( ch ) ) {
if ( ch != 0x0D ) {
if ( ch == 0x0A ) {
lines.push_back( thisLine ) ;
thisLine.clear() ;
} else {
thisLine += ch ;
}
}
}

This will handle the end of line conventions under both Unix and
Windows correctly (but not necessarily under other systems),
reading three lines, and leaving the file positionned after the
end of line of the last line.
Any thoughts? My guess is that it's perhaps due to that i
didn't open the file binary but does it really matter to
recognizing "the end"?
It can. Opening it in text would greatly simplify the above,
but would mean that you cannot possibly read the double
correctly.
How can i "switch" the openess
of the file?
You mean the mode: you can't, once the file is open.
Yes, the file _IS_ supposed to have a leading few lines of
normal text and then a bunch of binary data. Sad but true...
I've run into a similar convention before. In such cases,
you're stuck with reading it in binary, and recognizing the line
endings yourself.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Jun 11 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

4 posts views Thread by nightflyer | last post: by
50 posts views Thread by Michael Mair | last post: by
9 posts views Thread by jeff M via .NET 247 | last post: by
7 posts views Thread by John Dann | last post: by
30 posts views Thread by siliconwafer | last post: by
6 posts views Thread by arne.muller | last post: by
11 posts views Thread by Freddy Coal | last post: by
13 posts views Thread by swetha | last post: by
1 post views Thread by Solo | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.