0

ここでの問題は、すべてが正常に機能していると思いますが、実際のブロック変数が変化していないことです。それは 512 バイトの BLOCK サイズであり、その最初のバイトは block.head[0,1,2,3] としてリストされています。したがって、私のプログラムは block.head[] を使用して、読み込んでいるファイルのチャンクの最初の 4 バイトが一致するかどうかを確認します。

だから私が考えているのは、ファイルに BLOCK 量を読み込んでいるということですが、実際には block.head 変数を変更していません。したがって、ファイルの特定の部分を読み取っていても、比較する必要がある変数を変更していません。fread 引数に &block を書くとそれが変わると思っていましたが、そうではありません。

何かご意見は?

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef uint8_t  BYTE;
typedef uint32_t DWORD;

typedef struct
{
    BYTE head[4];
    DWORD restofblock[127];
}
BLOCK;

int main (void)
{
    //open card.raw
    FILE* fp = fopen("file.file", "r");

    //default name for new files is new000.jpg
    char outfile[10] = "new000.jpg";

    // char* infile = argv[1];
    // FILE* inptr = fopen(infile, "r");

    FILE* output;
    output = NULL;

    //define a black
    BLOCK block;

    //While we haven't read past the end of the file
    while (block.head[1] != EOF)
    {
        //read a BLOCK of the .raw file
        fread(&block, sizeof(BLOCK), 1, fp);

        //dual "if" statements because I couldn't figure out how to combine them
        //checks to see if the first four BYTES of BLOCK block are a JPEG header
        if (block.head[0] == 255 && block.head[1] == 231 && block.head[2] == 255)
        {
            if (block.head[3] == 239 || block.head[3] == 240)
            {

                fclose(output);

                //designating c as a placeholder for the 3rd 0 in the filename
                //checks to see if c is above or equal to "9".
                //if it is, it resets "9" to "0" and increments the 2nd 0 in the filename by 1
                //if it isn't it adds 1 to the 3rd "0"
                char c = (outfile[5]);
                if (c >= 71) //71 is the ascii equivalent of 9
                {
                    outfile[5] -= 9;
                    outfile[4]++;
                }
                else
                    outfile[5]++;

                //Read forward 1 BLOCK to check for EOF, if EOF is false, read back to original position and print. 
                //Otherwise read back to initial position.
                fread(&block, sizeof(BLOCK), 1, fp);
                if(block.head[0] != EOF)
                {
                    fread(&block, -sizeof(BLOCK), 1, fp);
                    output = fopen(outfile, "w");
                }
                else
                    fread(&block, -sizeof(BLOCK), 1, fp);
            }
        }
        if (output == NULL);

        else
            fwrite(&block, sizeof(BLOCK), 1, output);

   }
    fclose(output);
    fclose(fp);
    return 0;
}
4

1 に答える 1

0

それ以外の

while (block.head[1] != EOF)

次のように読む必要があります。

while (fread(&block, sizeof(BLOCK), 1, fp) > 0)

を割り当てる場所が見つかりませんでした。head[1] = EOFさらに、最初block.head[1]はその中にガベージ値があります。初期化せず、while 条件で使用するためです。

于 2013-04-03T05:11:03.243 に答える