Reading Binary file

Discussion in 'C Programming' started by Shalaka Joshi, Jul 14, 2006.

  1. Hi,

    I have binary file say, "test.bin". I write "FF" in the file and expect
    my code to read 255 for me.

    char * lbuf;
    int lreadBytes ;
    long lData;

    FILE *pFile = fopen ("c:\\testbin","rb");

    // Read data from binary file
    lreadBytes = fread(lbuf,1 ,1,pFile);

    if(lreadBytes!= 0)
    {
    lData = atol(lbuf); // converting char* to long
    }

    This does not work. lData is not 255 as i expect
    How do I convert char* to long when reading the binary data?

    Thanks and Regards,
    Shalaka
     
    Shalaka Joshi, Jul 14, 2006
    #1
    1. Advertisements

  2. Shalaka Joshi

    Tom St Denis Guest

    What do you think is in lbuf[0] at this point [provided it pointed
    somewhere valid]?

    Also where does lbuf point? This isn't a valid code snippet.

    What is actually in the file? The byte 0xFF or the ASCII characters
    FF?

    Tom
     
    Tom St Denis, Jul 14, 2006
    #2
    1. Advertisements

  3. Hi,

    thanks for ur response..

    lbuf reads the value correctly and shows me the "ascii" code
    corresponding to "ff" .
    In file I have 0xFF and not the ASCII FF.

    Best Regards,
    Shal

     
    Shalaka Joshi, Jul 14, 2006
    #3
  4. Shalaka Joshi

    Nelu Guest

    If you write "FF" into the file why do you expect the value to be 255?
    It may be 255 if you write 0xff into the file. "FF" probably means two
    bytes, each one being equal to the character code of 'F'.
    You read into the memory location lbuf points to, but you haven't
    allocated lbuf so you may not be allowed to write there.
    If you read only one character and don't want to be bothered with
    malloc then I suggest you declare lbuf as:

    char lbuf

    and read into &lbuf.

    atol needs a string. What you provide (beside not being allocated) is
    also not-null terminated so it's not a string. Even if it was correct,
    atol returns the value of the number represented by the string, so, if
    the string is "34512", atol would return the long 34512. In your case
    F is not a long, and if you used 0xFF (which is a number not a string)
    then your value would be the (probably ASCII) character corresponding
    to 255 and not the string "255".

    Also, char is signed and 255 may well be out of its range (considering
    x86 with char between -127 and 127).

    It depends how you want to convert char * to long. You can convert the
    value of a pointer to an int and cast that value to long (probably not
    what you want) and, if char * refers to a string, then you can use
    atol (but you are messing things up above).
     
    Nelu, Jul 14, 2006
    #4
  5. Sorry this is just a snapshot of the code. I have allocated memory to
    lbuf.

    well, I have 0xff into the file. So the value is 255.

    I know atol is not working here, but my question is, I have a binary
    file which has 0xff in it. When I read the file it reads ascii code in
    lbuf (of type char*) corresponding to "0xff ".

    Now if I have a variable of type long which I want to assign the value
    255. How do I extract lbuf value into my variable?
     
    Shalaka Joshi, Jul 14, 2006
    #5
  6. Don't top post. I've fixed it here.

    lbuf is most certainly not reading the value correctly, even though
    you may think that it is.

    You need to allocate memory before you use it.
     
    Andrew Poelstra, Jul 14, 2006
    #6
  7. 1) Stop topposting.
    2) Open your file in notepad or whatever your text editor is and paste
    it into your message. We would like to see the contents of this file.
    3) Allocate memory for lbuf. You've been told this twice by my count.
     
    Andrew Poelstra, Jul 14, 2006
    #7
  8.  
    Fred Kleinschmidt, Jul 14, 2006
    #8
  9. The cast isn't necessary:

    unsigned char c = 0xff;
    long i = x;
     
    Keith Thompson, Jul 14, 2006
    #9
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.