文件结束检测

End of File detection

我是一个非常新手的程序员,在处理优秀的 cs50 课程的问题集时遇到了一个我不明白其性质的问题。我已经实现了一个程序来从存储卡的图像中恢复 JPEG 图片,并在文件末尾实现中断,如下所示:

if(file > 1)
    {
        if (fread(&buffer, 1, 512, in_pointer) != 512)
        {
            free(filename);
            return 0;
        }
        else 
            fseek(in_pointer, -512, SEEK_CUR); 
    }

(图片以 512 字节块填满卡)。当我第一次实现它时,它破坏了我的第一张图片(它是可识别的但扭曲了)所以我通过第一个 if 语句排除了它。然而,现在集合的中间文件有点偏离——它们仍然以 Jpeg 格式打开,但我无法让它们的缩略图工作。我的假设是我破坏了 JPEG 文件格式 header。开头(包括该组的第一张和最后一张图片效果很好)。 我的问题是:

  1. 由于我的 getto 解决方案造成了麻烦,实现 EOF 中断的优雅方法是什么?

  2. 我创建的问题的性质可能是什么(通俗地说)?

非常感谢,

吉洪

ps这里是全部

#include <cs50.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdint.h>

int main(int argc, char *argv[])
{
// ensure proper usage
if (argc != 2)
{
    fprintf(stderr, "enter exactly two command line arguments: ./recover and destination of disc to scan\n");
    return 1;
}

//name the file
char *infile = argv[1];

//open card file and ensure proper format
FILE *in_pointer = fopen(infile, "r");
if (in_pointer == NULL)
{
    fprintf(stderr, "could not open %s\n", infile);
    return 2;
}

typedef uint8_t  BYTE;

BYTE buffer[512];
bool new_jpeg = false;
int block = 0;
int file = 0;
char *filename = malloc(3);
//sprintf(filename, "%03i.jpg",1);

do
{

    //read a 512 block of a jpeg
    fread(&buffer, 512, 1, in_pointer);

    //check for new jpeg
    if (buffer[0] == 0xff &&
        buffer[1] == 0xd8 &&
        buffer[2] == 0xff &&
        (buffer[3] & 0xf0) == 0xe0) // took me a while to figure this out
        {
    new_jpeg = true;
    //printf("jpeg found, block %i\n", block);
        }

    block++;



} while(new_jpeg == false);

do
{
            //set name of file to write to
            sprintf(filename, "%03i.jpg",file);
            file++;
            new_jpeg = false;

            // open output file
            FILE *img = fopen(filename, "w");
            if (img == NULL)
                {
                    fprintf(stderr, "Could not create %s.\n", filename);
                    return 3;
                }


        //add blocks to file while before we reach the nea JPEG.
        do
        {


                fwrite(&buffer, 1, 512, img);

                //read the next block
                fread(&buffer, 1, 512, in_pointer);

                //There MUST be a better way... Anyhow this checks for end of file but backtracks becouse the act of checking moved the file coursor forward... 
                if(file > 1)
                {
                    if (fread(&buffer, 1, 512, in_pointer) != 512)
                    {
                        free(filename);
                        return 0;
                    }
                    else 
                    fseek(in_pointer, -512, SEEK_CUR); 
                }


                block++; //we are reading off teh next block

                if (buffer[0] == 0xff &&
                    buffer[1] == 0xd8 &&
                    buffer[2] == 0xff &&
                    (buffer[3] & 0xf0) == 0xe0) // took me a while to figure this out
                {
                    new_jpeg = true;
                    //printf("jpeg %i found, block %i\n", file, block);
                }


        }while(new_jpeg == false);

}while(!feof(in_pointer));    

free(filename);
//ran valgrind no probs detected.
}

好的,我修好了。

我没有用一整段单独的代码来检查 eof,而是一举杀死了两只鸟,并在检查 eof 时 fread 文件:

                //read the next block
                int k = fread(&buffer, 1, 512, in_pointer);
                if(k != 512)
                {
                        free(filename);
                        return 0;
                }

我仍然不知道为什么我以前的方法不起作用,我将非常感谢您的建议...