私は非常に初心者のプログラマーであり、優れた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文でそれを除外しました。今ではセットの中間ファイルは少しオフです - 彼らはまだJpegsとして開きますが、私は彼らのサムネイルを動作させることができません。私の仮説は、私がJPEGファイルフォーマットヘッダを壊しているということです。最初(セットの最初と最後のイメージを完全に含む)。 私の質問は以下のとおりです。
私月桃ソリューションは、トラブルの原因となっているので、EOFブレークを実装するためのエレガントな方法は何ですか?
私が作成した問題の可能性は何ですか?
は、ここで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.
}
ファイルを開くためにどのモードが使用されましたか?バイナリファイルを示すために 'rb'を指定しましたか? – levengli
いいえ...私は複数のファイルに書き込んでいるので "w"を使用しました... 編集:rbモードで最初のファイルを開くようにしましたが、それは役に立たなかった – Tikhon
もっとコードを追加してください。スニペットから正確に何が問題になるのかは明らかではありません – levengli