您好,感謝您的瀏覽。
我正在使用 CS50x 并且正在努力使用Recover。目的是打開一個 .raw 檔案,以 512 位元組塊讀取其內容,檢查 .jpg 標頭的前四個位元組,然后將每個 JPEG 資料寫入一個新檔案。
我撰寫了一段代碼,并且檔案編譯了。除錯器告訴我我的 buffer[512] 變數保持為空/歸零。這意味著程式跳過 if/else 條件并且程式退出。
雖然我在 While 回圈中的邏輯可能存在缺陷,但我無法深入到程式中來考慮這一點。
我在發布之前查看了我的問題。有的源喜歡用fread(buffer, 512, 1, input),但CS50本身用fread(buffer, 1, 512, input)的。另外,在初始化檔案名??時,我已經嘗試過 char *filename = malloc(8 * sizeof(char));和char filename[8];。對于這兩行,我都嘗試了每種方法,但仍然缺少一些東西。
我的代碼如下。提前感謝您的寶貴時間。
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef uint8_t BYTE;
int main(int argc, char *argv[])
{
// First check the number of arguments is correct.
if (argc != 2)
{
printf("Correct Usage: ./recover.c [filename]\n");
return 1;
}
// Open the file.
FILE *inputFile = fopen(argv[1], "r");
if (inputFile == NULL)
{
printf("File not found.\n");
return 1;
}
// Create counter of number of files.
int counter = 0;
// Create filename variable
char *filename = malloc(8 * sizeof(char)); // 7 1 for \0
// Create a 512-size array buffer.
BYTE buffer[512];
// Initialise img file for scope access.
FILE *img = NULL;
while (fread(buffer, sizeof(BYTE), 512, inputFile))
{
// If start of new JPEG:
if (buffer[0] == 0xff && buffer[1] == 0xd8 && buffer[2] == 0xff && (buffer[3] & 0xf0) == 0xe0)
{
if (counter == 0) // If the FIRST JPEG
{
// Make new file:
sprintf(filename, "i.jpg", counter);
img = fopen(filename, "w");
fwrite(buffer, sizeof(BYTE), 512, img);
}
else // If not the first JPEG
{
fclose(img); // Close previous file.
counter ;
// Make new file:
sprintf(filename, "i.jpg", counter); // Update filename.
img = fopen(filename, "w");
fwrite(buffer, sizeof(BYTE), 512, img);
}
}
else if (counter > 0) // buffer is continuation of previous.
{
fwrite(buffer, sizeof(BYTE), 512, img);
}
else
{
printf("I exited with no images.\n");
return 2;
}
}
free(filename);
fclose(img);
fclose(inputFile);
return 0;
}
uj5u.com熱心網友回復:
程式在讀取原始檔案的第一行后退出(回傳)(假設它不是 jpeg 標頭,發行版原始檔案就是這種情況)。else if (counter > 0)評估為假,因此else分支執行。
uj5u.com熱心網友回復:
謝謝大家的回復。現在問題已經解決了!
@DinoCoderSaurus(抱歉,還不能投票)促使我意識到我(錯誤地)假設原始檔案中的資料將立即以 .jpeg 標頭開頭(實際上看起來資料以隱藏訊息開頭, “驚喜”)。
該Else條件最初被放在那里是為了避免錯誤,但當然它過早地退出了 While 回圈。幾次回圈后,緩沖區被正確填充。
然后我遇到了第二個問題(由@Some_programmer_dude 指出),counter ;它出現在錯誤的位置,這意味著在第一個新JPEG 之后,不能再寫入其他的了。
我還將考慮您對最佳實踐的評論。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/455480.html
