473,326 Members | 2,111 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,326 software developers and data experts.

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 2792
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: nightflyer | last post by:
Hi all, [code snippet appended at the end.) my question: A class has a few string variables with not know length at design time. Now I declare lets say a 1000 of those classes and put them...
50
by: Michael Mair | last post by:
Cheerio, I would appreciate opinions on the following: Given the task to read a _complete_ text file into a string: What is the "best" way to do it? Handling the buffer is not the problem...
0
by: Neo | last post by:
Hello: I am receiving a Binary File in a Request from a application. The stream which comes to me has the boundary (Something like "---------------------------390C0F3E0099" without the quotes),...
9
by: jeff M via .NET 247 | last post by:
I'm still having problems reading EBCDIC files. Currently itlooks like the lower range (0 to 127) is working. I have triedthe following code pages 20284, 20924, 1140, 37, 500 and 20127.By working I...
7
by: John Dann | last post by:
I'm trying to read some binary data from a file created by another program. I know the binary file format but can't change or control the format. The binary data is organised such that it should...
30
by: siliconwafer | last post by:
Hi All, I want to know tht how can one Stop reading a file in C (e.g a Hex file)with no 'EOF'?
6
by: arne.muller | last post by:
Hello, I've come across some problems reading strucutres from binary files. Basically I've some strutures typedef struct { int i; double x; int n; double *mz;
11
by: Freddy Coal | last post by:
Hi, I'm trying to read a binary file of 2411 Bytes, I would like load all the file in a String. I make this function for make that: '-------------------------- Public Shared Function...
13
by: swetha | last post by:
HI Every1, I have a problem in reading a binary file. Actually i want a C program which reads in the data from a file which is in binary format and i want to update values in it. The file...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.