fprintf format specifiers

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Harry

    #1

    fprintf format specifiers

    Good Day,

    Is there a way to print 8 bytes in a line in a file using
    fprintf...like this

    12 76 89 76 86 34 98 08
    A4............. ............... ..

  • Richard Heathfield

    #2
    Re: fprintf format specifiers

    Harry said:
    Good Day,
    >
    Is there a way to print 8 bytes in a line in a file using
    fprintf...like this
    >
    12 76 89 76 86 34 98 08
    A4............. ............... ..
    Nope. But of course you can do something like this:

    int ch;
    int i = 0;
    while((ch = getc(fpin)) != EOF)
    {
    fprintf(fpout, " %02X", ch);
    if(++i % 8 == 0)
    {
    i = 0;
    putc('\n', fpout);
    }
    }
    if(i 0)
    {
    putc('\n', fpout);
    }


    --
    Richard Heathfield
    "Usenet is a strange place" - dmr 29/7/1999

    email: rjh at above domain (but drop the www, obviously)

    Comment

    • Nils O. Selåsdal

      #3
      Re: fprintf format specifiers

      Richard Heathfield wrote:
      Harry said:
      >
      >Good Day,
      >>
      >Is there a way to print 8 bytes in a line in a file using
      >fprintf...li ke this
      >>
      >12 76 89 76 86 34 98 08
      >A4............ ............... ...
      >
      Nope. But of course you can do something like this:
      Well - one could read 8 bytes, and do
      fprintf(fpout, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
      buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);

      Assuming he wanted a hexadecimal representation of each
      of the individual byte values.


      int ch;
      int i = 0;
      while((ch = getc(fpin)) != EOF)
      {
      fprintf(fpout, " %02X", ch);
      if(++i % 8 == 0)
      {
      i = 0;
      putc('\n', fpout);
      }
      }
      if(i 0)
      {
      putc('\n', fpout);
      }

      Comment

      • Richard Heathfield

        #4
        Re: fprintf format specifiers

        "Nils O. Selåsdal" said:
        Richard Heathfield wrote:
        >Harry said:
        >>
        >>Good Day,
        >>>
        >>Is there a way to print 8 bytes in a line in a file using
        >>fprintf...lik e this
        >>>
        >>12 76 89 76 86 34 98 08
        >>A4........... ............... ....
        >>
        >Nope. But of course you can do something like this:
        Well - one could read 8 bytes, and do
        fprintf(fpout, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
        buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
        ....er, oh yeah, so he can. :-)

        --
        Richard Heathfield
        "Usenet is a strange place" - dmr 29/7/1999

        email: rjh at above domain (but drop the www, obviously)

        Comment

        • CBFalconer

          #5
          Re: fprintf format specifiers

          Richard Heathfield wrote:
          Harry said:
          >
          Is there a way to print 8 bytes in a line in a file using
          fprintf...like this

          12 76 89 76 86 34 98 08
          A4............. ............... ..
          >
          Nope. But of course you can do something like this:
          >
          int ch;
          int i = 0;
          while((ch = getc(fpin)) != EOF)
          {
          fprintf(fpout, " %02X", ch);
          if(++i % 8 == 0)
          {
          i = 0;
          putc('\n', fpout);
          }
          }
          if(i 0)
          {
          putc('\n', fpout);
          }
          How about:

          char b[8];
          ...
          fprintf(fpout, "%02x", b[0]);
          for (i = 1, i < 8; i++) fprintf(fpout, " %02x", b[i]);
          putc(fpout, '\n');

          or

          fprintf(fpout, "%02x %02x %02x %02x %02x %02x %02x %02x\j",
          b[0], b[1], b[2], b[3], b[4], b[5], b[6], b[7]);

          --
          Some informative links:
          <news:news.anno unce.newusers
          <http://www.geocities.c om/nnqweb/>
          <http://www.catb.org/~esr/faqs/smart-questions.html>
          <http://www.caliburn.nl/topposting.html >
          <http://www.netmeister. org/news/learn2quote.htm l>
          <http://cfaj.freeshell. org/google/>


          Comment

          • Christopher Benson-Manica

            #6
            Re: fprintf format specifiers

            Richard Heathfield <invalid@invali d.invalidwrote:
            Well - one could read 8 bytes, and do
            fprintf(fpout, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
            buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
            ...er, oh yeah, so he can. :-)
            Yes, but what about the (likelier) case where the file has a number of
            bytes that isn't a multiple of 8? Your original version handled that
            easily; the suggested version less so. I'm presuming, possibly
            incorrectly, that fprintf() is expensive relative to sprintf(), so
            perhaps something like this would be good (criticisms welcome):

            #include <stdio.h>
            #include <assert.h>

            #define BYTES_PER_LINE 8

            int main( int argc, char *argv[] )
            {
            char outbuf[3*BYTES_PER_LIN E+1], *bufptr;
            int inchar, count=0;
            FILE *fpin, *fpout;

            assert( argc 2 );
            assert( (fpin = fopen(argv[1],"r")) != NULL );
            assert( (fpout = fopen(argv[2],"w")) != NULL );
            bufptr = outbuf;
            while( (inchar=fgetc(f pin)) != EOF ) {
            bufptr += sprintf( bufptr, "%02X ", inchar ); /* assume success */
            if( ++count % BYTES_PER_LINE == 0 ) {
            *(bufptr-1)='\n';
            fputs( outbuf, fpout );
            bufptr = outbuf;
            }
            }
            if( bufptr != outbuf ) {
            *(bufptr-1)='\n';
            fputs( outbuf, fpout );
            }
            assert( !fclose(fpin) );
            assert( !fclose(fpout) );
            return 0;
            }

            --
            C. Benson Manica | I *should* know what I'm talking about - if I
            cbmanica(at)gma il.com | don't, I need to know. Flames welcome.

            Comment

            • Richard Heathfield

              #7
              Re: fprintf format specifiers

              Christopher Benson-Manica said:
              Richard Heathfield <invalid@invali d.invalidwrote:
              >
              Well - one could read 8 bytes, and do
              fprintf(fpout, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
              buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
              >
              >...er, oh yeah, so he can. :-)
              >
              Yes, but what about the (likelier) case where the file has a number of
              bytes that isn't a multiple of 8? Your original version handled that
              easily;
              Naturellement.. .
              the suggested version less so.
              ....mais, m'sieur, le question originale ne called pas for une solution
              generale. Il merely required pour huit bytes to be ecri a stdout, oui?
              I'm presuming, possibly
              incorrectly, that fprintf() is expensive relative to sprintf(), so
              perhaps something like this would be good (criticisms welcome):
              >
              #include <stdio.h>
              #include <assert.h>
              >
              #define BYTES_PER_LINE 8
              >
              int main( int argc, char *argv[] )
              {
              char outbuf[3*BYTES_PER_LIN E+1], *bufptr;
              I'd be tempted to make the "bytes per line" value configurable at runtime.
              int inchar, count=0;
              FILE *fpin, *fpout;
              >
              assert( argc 2 );
              assert( (fpin = fopen(argv[1],"r")) != NULL );
              assert( (fpout = fopen(argv[2],"w")) != NULL );
              Three consecutive poor uses of assert. (I suspect you know this. I'm merely
              heads-upping for newbies' benefit.)
              bufptr = outbuf;
              while( (inchar=fgetc(f pin)) != EOF ) {
              bufptr += sprintf( bufptr, "%02X ", inchar ); /* assume success */
              if( ++count % BYTES_PER_LINE == 0 ) {
              *(bufptr-1)='\n';
              Does that overwrite the null terminator? I haven't checked, and perhaps it
              doesn't, but the safety of the code is not obvious at a (cursory) glance.
              fputs( outbuf, fpout );
              bufptr = outbuf;
              }
              }
              if( bufptr != outbuf ) {
              *(bufptr-1)='\n';
              fputs( outbuf, fpout );
              }
              assert( !fclose(fpin) );
              assert( !fclose(fpout) );
              Two more poor uses of assert. If you must do this, spin them around. If you
              can't close the input file, it would be good to at least have had a stab at
              closing the output file before the abort.

              --
              Richard Heathfield
              "Usenet is a strange place" - dmr 29/7/1999

              email: rjh at above domain (but drop the www, obviously)

              Comment

              • Rod Pemberton

                #8
                Re: fprintf format specifiers


                "Christophe r Benson-Manica" <ataru@otaku.fr eeshell.orgwrot e in message
                news:eglfn4$smh $1@chessie.cirr .com...
                Richard Heathfield <invalid@invali d.invalidwrote:
                >
                Well - one could read 8 bytes, and do
                fprintf(fpout, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
                buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
                >
                ...er, oh yeah, so he can. :-)
                >
                Yes, but what about the (likelier) case where the file has a number of
                bytes that isn't a multiple of 8? Your original version handled that
                easily; the suggested version less so. I'm presuming, possibly
                incorrectly, that fprintf() is expensive relative to sprintf(), so
                perhaps something like this would be good (criticisms welcome):
                >
                In that case, you'd use fread() with the size of a fixed buffer. fread()
                will return the quantity read. This will either be the size of the buffer,
                or a smaller quantity. So, you need two printing loops: one for the entire
                buffer, and one for the remaining bytes. Both of which have been shown.


                Rod Pemberton


                Comment

                • Tak-Shing Chan

                  #9
                  Re: fprintf format specifiers

                  On Fri, 13 Oct 2006, Rod Pemberton wrote:
                  >
                  "Christophe r Benson-Manica" <ataru@otaku.fr eeshell.orgwrot e in message
                  news:eglfn4$smh $1@chessie.cirr .com...
                  >Richard Heathfield <invalid@invali d.invalidwrote:
                  >>
                  >>>Well - one could read 8 bytes, and do
                  >>>fprintf(fpou t, "%02X %02X %02X %02X %02X %02X %02X %02X\n",
                  >>>buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
                  >>
                  >>...er, oh yeah, so he can. :-)
                  >>
                  >Yes, but what about the (likelier) case where the file has a number of
                  >bytes that isn't a multiple of 8? Your original version handled that
                  >easily; the suggested version less so. I'm presuming, possibly
                  >incorrectly, that fprintf() is expensive relative to sprintf(), so
                  >perhaps something like this would be good (criticisms welcome):
                  >>
                  >
                  In that case, you'd use fread() with the size of a fixed buffer. fread()
                  will return the quantity read. This will either be the size of the buffer,
                  or a smaller quantity. So, you need two printing loops: one for the entire
                  buffer, and one for the remaining bytes. Both of which have been shown.
                  In theory one could also use Duff's device:

                  int n = (count + 7) / 8;

                  switch (count % 8) {
                  case 0: do { printf("%02X ", *from++);
                  case 7: printf("%02X ", *from++);
                  case 6: printf("%02X ", *from++);
                  case 5: printf("%02X ", *from++);
                  case 4: printf("%02X ", *from++);
                  case 3: printf("%02X ", *from++);
                  case 2: printf("%02X ", *from++);
                  case 1: printf("%02X ", *from++);
                  putchar('\n');
                  } while (--n 0);
                  }

                  Tak-Shing

                  Comment

                  • Christopher Benson-Manica

                    #10
                    Re: fprintf format specifiers

                    Richard Heathfield <invalid@invali d.invalidwrote:
                    ...mais, m'sieur, le question originale ne called pas for une solution
                    generale. Il merely required pour huit bytes to be ecri a stdout, oui?
                    Ah, le Francais, le langue d'amour! It sounds like you remember as
                    much of it as I do ;-) (Tu as raison.)
                    I'd be tempted to make the "bytes per line" value configurable at runtime.
                    A rare time to give oneself over to the seductive whisperings of
                    temptation with nary a pang of guilt...
                    Three consecutive poor uses of assert. (I suspect you know this. I'm merely
                    heads-upping for newbies' benefit.)
                    Right, they were quick cover-my-bases hacks.
                    while( (inchar=fgetc(f pin)) != EOF ) {
                    bufptr += sprintf( bufptr, "%02X ", inchar ); /* assume success */
                    if( ++count % BYTES_PER_LINE == 0 ) {
                    *(bufptr-1)='\n';
                    Does that overwrite the null terminator? I haven't checked, and perhaps it
                    doesn't, but the safety of the code is not obvious at a (cursory) glance.
                    No, bufptr points to the null terminator, assuming per the comment
                    that sprintf() doesn't do anything unexpected; the code overwrites
                    the last space in the string. The fact that it wasn't obvious to
                    you probably means it isn't the best plan, but it does work.
                    Two more poor uses of assert. If you must do this, spin them around. If you
                    can't close the input file, it would be good to at least have had a stab at
                    closing the output file before the abort.
                    Agreed, thank you.

                    --
                    C. Benson Manica | I *should* know what I'm talking about - if I
                    cbmanica(at)gma il.com | don't, I need to know. Flames welcome.

                    Comment

                    Working...