RSS Forums RSS
Please support our C++ advertiser: Programming Forums
Views: 4210 | Replies: 18
Reply
Join Date: Feb 2005
Posts: 464
Reputation: winbatch is on a distinguished road 
Rep Power: 4
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Error reading in file in binary mode

  #1  
Jul 14th, 2005
Guys,

Either there is a bug in the compiler or I'm getting dumber by the day. I want to read an entire file into memory. (Very small file, so no worries about size here). I followed the example here (from www.cplusplus.com)
// reading binary file
#include <iostream.h>
#include <fstream.h>

const char * filename = "example.txt";
int main ()
{
   char * buffer;
   long size;
   ifstream file (filename, ios::in|ios::binary|ios::ate);
   size = file.tellg();
   file.seekg (0, ios::beg);
   buffer = new char [size];
   file.read (buffer, size);
   file.close();
   cout << "the complete file is in a buffer";
   delete[] buffer;
   return 0;
}
<< moderator edit: added [code][/code] tags and reformatted >>

However, when I use this code, I always get the first character of the file twice!!! For example, if I have a file which contains:
SAM LOVES TO TEST FILES

I end up with:
SSAM LOVES TO TEST FILES

Is this a known bug or am I not supposed to believe this reputable site? Is there a 'C' way to do this which is better?

Thanks,
Winbatch
AddThis Social Bookmark Button
Reply With Quote  
Join Date: Apr 2004
Posts: 3,764
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 17
Solved Threads: 147
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Error reading in file in binary mode

  #2  
Jul 14th, 2005
I didn't see the issue, but WRT a C version I think it would be something like this.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   static const char filename[] = "file.txt";
   FILE *file = fopen(filename, "rb");
   if ( file )
   {
      char *buffer;
      long size;
      fseek(file, 0, SEEK_END);
      size = ftell(file);
      rewind(file);
      buffer = malloc(size);
      if ( buffer )
      {
         if ( fread(buffer, size, 1, file) == 1 )
         {
            /* puts(buffer); */
         }
      }
      fclose(file);
      free(buffer);
   }
   return 0;
}
High Plains Blogger #plains #lounge ## I, for one, welcome our new socialist overlords.
"Capitalism is the unequal distribution of wealth. Socialism is the equal distribution of poverty."
Reply With Quote  
Join Date: Feb 2005
Posts: 464
Reputation: winbatch is on a distinguished road 
Rep Power: 4
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Error reading in file in binary mode

  #3  
Jul 14th, 2005
Dave,

When you used the code I posted you didn't have any trouble? Wonder if it's a compiler specific bug - I'm using Sun Workshop 6 on solaris... I tried your code and it works... I put the puts(buffer) back ;)


Winbatch
Reply With Quote  
Join Date: Apr 2004
Posts: 3,764
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 17
Solved Threads: 147
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Error reading in file in binary mode

  #4  
Jul 14th, 2005
First, I rarely start by looking at the compiler; I'd say about 99% of the time it is the code. Just because I didn't see what you saw doesn't mean there wasn't an issue with it.

I think in part what is missing is what is missing. How do you see what you see? Where is some sort of output statement?

One of the reasons I put the puts line in comments is that it probably isn't what you are doing and it's probably not the correct thing to do. And perhaps that is the issue -- on the output side, not the input side.
High Plains Blogger #plains #lounge ## I, for one, welcome our new socialist overlords.
"Capitalism is the unequal distribution of wealth. Socialism is the equal distribution of poverty."
Reply With Quote  
Join Date: Feb 2005
Posts: 464
Reputation: winbatch is on a distinguished road 
Rep Power: 4
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Error reading in file in binary mode

  #5  
Jul 14th, 2005
This was the code:
// reading binary file
#include <iostream.h>
#include <fstream.h>
const char * filename = "test.txt";
int main ()
{
char * buffer;
long size;
ifstream file (filename, ios::in|ios::binary|ios::ate);
size = file.tellg();
file.seekg (0, ios::beg);
buffer = new char [size];
file.read (buffer, size);
file.close();
cout<<buffer<<endl;
delete[] buffer;
return 0;
}


(Also note that cout<<buffer[0]<<endl; and cout<<buffer[1]<<endl; also produced the same letter.....)
Reply With Quote  
Join Date: Apr 2004
Posts: 3,764
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 17
Solved Threads: 147
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Error reading in file in binary mode

  #6  
Jul 14th, 2005
Hmm. When I run either C or C++ version in the command shell in SlickEdit (my usual location that helps discover things like the need for fflush(stdout) and such) I get a blank area where the text should be. To me this would tell me that I might be missing something. When I run it in a cmd shell this does not happen. [edit]Ah the CR of the CR-LF was erasing the line for the SlickEdit output window. A fallout of binary mode reading.[/edit]

I am using Windows, so I might suspect my version would have issues with the binary vs text modes. But I wouldn't expect such things on Solaris. Outputting one at a time from 0 to size would have been my suggestion, so I'm a little miffed.

What is the "big picture" of what you are trying to do?


[edit2]This is the code I am using.
#include <iostream>
using std::cout;
using std::endl;
using std::ios;
#include <fstream>
using std::ifstream;

const char filename[] = "file.txt";

int main ()
{
   ifstream file(filename, ios::in | ios::binary | ios::ate);
   long size = file.tellg();
   file.seekg(0, ios::beg);
   char *buffer = new char [size];
   file.read(buffer, size);
   file.close();
   for ( long i = 0; i < size; ++i )
   {
      cout << buffer[i];
   }
   cout << endl;
   delete[] buffer;
   return 0;
}

/* file.txt (no newline at end)
SAM LOVES TO TEST FILES
*/

/* my output
SAM LOVES TO TEST FILES
*/
High Plains Blogger #plains #lounge ## I, for one, welcome our new socialist overlords.
"Capitalism is the unequal distribution of wealth. Socialism is the equal distribution of poverty."
Reply With Quote  
Join Date: Feb 2005
Posts: 464
Reputation: winbatch is on a distinguished road 
Rep Power: 4
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Error reading in file in binary mode

  #7  
Jul 14th, 2005
The big picture is that I am loading an MQ series queue with the text of a file. (It's a command line utility). Since I don't know the size of the message at the start, I am reading it in binary so to that I can set the size of the buffer dynamically. In any case, I was able to get it to work with the C code version, so I'm good to go.
Reply With Quote  
Join Date: Apr 2004
Posts: 3,764
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 17
Solved Threads: 147
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Error reading in file in binary mode

  #8  
Jul 14th, 2005
A vector of strings for C++?
High Plains Blogger #plains #lounge ## I, for one, welcome our new socialist overlords.
"Capitalism is the unequal distribution of wealth. Socialism is the equal distribution of poverty."
Reply With Quote  
Join Date: Feb 2005
Posts: 464
Reputation: winbatch is on a distinguished road 
Rep Power: 4
Solved Threads: 18
winbatch's Avatar
winbatch winbatch is offline Offline
Posting Pro in Training

Re: Error reading in file in binary mode

  #9  
Jul 14th, 2005
I don't need a vector, I have a single string. (The file contains one message, not a bunch of messages)
Reply With Quote  
Join Date: Apr 2004
Posts: 3,764
Reputation: Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light Dave Sinkula is a glorious beacon of light 
Rep Power: 17
Solved Threads: 147
Colleague
Dave Sinkula's Avatar
Dave Sinkula Dave Sinkula is offline Offline
long time no c

Re: Error reading in file in binary mode

  #10  
Jul 14th, 2005
Another stray thought:
#include <iostream>
#include <fstream>
#include <sstream>

int main ()
{
   static const char filename[] = "file.txt";
   std::ifstream file(filename);
   std::ostringstream text;
   text << file.rdbuf(); // slurp
   std::cout << text.str() << std::endl;
   return 0;
}

/* my output
SAM LOVES TO TEST FILES
*/
High Plains Blogger #plains #lounge ## I, for one, welcome our new socialist overlords.
"Capitalism is the unequal distribution of wealth. Socialism is the equal distribution of poverty."
Reply With Quote  
Reply

Only community members can participate in forum threads. You must register or log in to contribute.

Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)

 

Thread Tools Display Modes
Forums | Blogs | Tutorials | Code Snippets | Whitepapers | RSS Feeds | Advertising
All times are GMT -4. The time now is 9:52 pm.
Newsletter Archive - Sitemap - Privacy Statement - Acceptable Use Policy - Contact Us
Forum system based on vBulletin Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
©2003 - 2008 DaniWeb® LLC