Write a file in c of an array of integers with fputc

后端 未结 3 676
鱼传尺愫
鱼传尺愫 2021-01-17 07:52

I\'m writing a program that reads a file and generates an array of integers of each byte, first I prove with a .txt file and I generates the ASCII for each of the letters an

相关标签:
3条回答
  • 2021-01-17 08:39

    Problem #1:

    You call fclose inside the loop which is of cause bad as you are still trying to write to the file. Move the fclose outside the while loop.

    Problem #2:

    while (!feof(f1))
    

    is not the correct way to check if the end-of-file has been reached. Instead you should check the return value from getc Like:

    while ((a = getc(f1)) != EOF)
    

    Problem #3:

    You can't write the binary values one by one to the output file to reproduce the original char. fputc writes a whole char - not a bit. Therefore you need to rebuild the original char from the binary values and only call fputconce.

    Alternative binary calculation

    Your code calculates the binary representation (bit values) correct. However, it seems that you use a too complicated method. Consider using >> (aka right shift) instead. Like:

        // Create the binary values
        for (i = 7; i >= 0; i--)
        {
          rest[i] = a & 1;
          a = a >> 1;
        }
    

    So putting it all together, the code could be:

    int main(void)
    {
    
        int i;
        char a;
        int t;
        FILE *f1, *fp;
        int rest[8];
    
        f1 = fopen("UAM.txt", "rb");   // TODO: check that fopen went well
        fp = fopen("file.txt", "w+");  // TODO: check that fopen went well
    
        while ((a = getc(f1)) != EOF)
        {
            printf("Char representation %c\n", a);
            printf("Decimal representation %d\n", a);
    
            // Create the binary values
            for (i = 7; i >= 0; i--)
            {
              rest[i] = a & 1;
              a = a >> 1;
            }
    
            printf("Binary representation: ");
            for (i = 0; i <= 7; i++)
            {
              printf("%d", rest[i]);
            }
            printf("\n");
    
            // Reconstruct original value
            t = 0;
            for (i = 0; i <= 7; i++)
            {
              t = t << 1;
              t = t | rest[i];
            }
    
            // Write reconstructed value to file
            fputc(t, fp);
        }
    
        fclose(fp);
        fclose(f1);
        return 0;
    }
    
    0 讨论(0)
  • 2021-01-17 08:46

    The problem is because of use of fputc. It always prints a character, so value of rest[x] is converted into a character and then written to the file. That is why you are seeing all garbage in file.

    Replace below:

    fprintf(fp,"%i", rest[x]); // %i here would print the expected value
    //fputc(rest[x], fp);
    

    Also, close should be out of loop.

    One more thing to notice is, as you are reading character by character till end of file, it would convert ending "\n" and "\r" characters also.

    Below is the working program:

    #include <stdio.h>
    
    
    int main() {
    
    int b1, b2, b3, b4, b5, b6, b7, b8;
    int x, i;
    char a;
    
    FILE *f1, *fp;
    
    b1 = 0x01; // = 0000 0001
    b2 = 0x02; // = 0000 0010
    b3 = 0x04; // = 0000 0100
    b4 = 0x08; // = 0000 1000
    b5 = 0x10; // = 0001 0000
    b6 = 0x20; // = 0010 0000
    b7 = 0x40; // = 0100 0000
    b8 = 0x80; // = 1000 0000
    
    int mask[8] = { b8, b7, b6, b5, b4, b3, b2, b1 };
    int rest[8];
    
    f1 = fopen("UAM.txt", "rb");
    fp = fopen("file.txt", "w+");
    
    while (!feof(f1))
    {
        a = getc(f1);
        printf("%d\n", a);
    
        for (i = 0; i <= 7; i++)
        {
            rest[i] = a & mask[i];
        }
    
        for (i = 0; i <= 7; i++)
        {
            rest[i] = rest[i] / mask[i];
        }
    
        for (x = 0; x <= 7; x++)
        {
            printf("%i", rest[x]);
            fprintf(fp,"%i", rest[x]);
            //fputc(rest[x], fp);
        }
        fprintf(fp,"\n");
        printf("\n");
    }
    fclose(f1);
    fclose(fp);
    
    return 0;
    }
    
    0 讨论(0)
  • 2021-01-17 08:48

    You should reconstruct the integer starting from your array using your mask array.

    #include<stdio.h>
    
    int main(void)
    {
    
        int b1, b2, b3, b4, b5, b6, b7, b8;
        int x, i;
        char a, b;
    
        FILE *f1, *bin, *fp;
    
        b1 = 0x01; // = 0000 0001
        b2 = 0x02; // = 0000 0010
        b3 = 0x04; // = 0000 0100
        b4 = 0x08; // = 0000 1000
        b5 = 0x10; // = 0001 0000
        b6 = 0x20; // = 0010 0000
        b7 = 0x40; // = 0100 0000
        b8 = 0x80; // = 1000 0000
    
        int mask[8] = { b8, b7, b6, b5, b4, b3, b2, b1 };
        int rest[8];
    
        f1 = fopen("UAM.txt", "rb");
        fp = fopen("file.txt", "w+");
    
        while ((a = fgetc(f1)) != EOF)
        {
            printf("%d\n", a);
    
            for (i = 0; i <= 7; i++)
            {
                rest[i] = a & mask[i];
            }
    
            for (i = 0; i <= 7; i++)
            {
                rest[i] = rest[i] / mask[i];
            }
    
            a=0;
            for (x = 0; x <= 7; x++)
            {
                printf("%i", rest[x]);
                a += rest[x] * mask[x];
            }
    
            printf("\n%d\n", a);
    
            fputc(rest[x], fp);
    
            printf("\n");
        }
    
        fclose(f1);
        fclose(fp);
    
        return 0;
    }
    

    A better approach could be

    #include<stdio.h>
    
    int main(void)
    {
    
        int x, i;
        char a;
    
        FILE *f1, *fp;
    
        int rest[8];
    
        f1 = fopen("UAM.txt", "rb");
        if ( f1 != NULL)
        {
            fp = fopen("file.txt", "w+");
    
            if ( fp != NULL)
            {
                while ((a = fgetc(f1)) != EOF)
                {
                    printf("%d\n", a);
    
                    for (i = 0; i < 8; i++)
                    {
                        rest[i] = a & 0x01;
    
                        a>>=1;
                    }
    
                    a=0;
                    for (x = 7; x >= 0; x--)
                    {
                        printf("%i", rest[x]);
    
                        a += ((0x01u << x) * rest[x]);
                    }
    
                    fputc(rest[x], fp);
    
                    printf("\n");
                }
    
                fclose(fp);
            }
    
            fclose(f1);
        }
    
        return 0;
    }
    
    0 讨论(0)
提交回复
热议问题