Я получаю ошибку сегментации в строке 28 приведенного ниже кода. Примечание: программа не завершена.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// get data
FILE* raw = fopen("card.raw", "r");
int rawLength = 0;
while(fgetc(raw) != EOF){
rawLength++;
}
char dat[rawLength + 1];
fread(dat, 1, rawLength + 1, raw);
// separate data into blocks
int data[sizeof(dat) / 512][512];
data[0][0] = atoi(*dat[0]); // <----------- this is line 28 where the error is happening.
for(int i = 0; i < sizeof(data) / 4; i += 512)
{
for(int j = 0; j < 512; j++)
{
data[i][j] = atoi(*dat[i + j]);
}
}
}
Этот код должен открыть необработанный файл с именем «card.raw» и прочитать его содержимое и размер. Затем он проверяет наличие jpeg внутри файла, используя официальный заголовок jpeg: «0xff 0xd8 0xff [что-то от 0xe0 до 0xef]».
На данный момент это все, что он делает, но когда я закончу с ним, он должен сохранить каждый найденный jpeg в новом файле. По сути, это система восстановления jpeg, поскольку папка для мусора ваших устройств похожа на нее. Все, о чем я прошу, это выяснить ошибку; вам не нужно писать целую программу восстановления, если вы не можете прямо сейчас. спасибо за помощь!
Почему бы тебе не попробовать его отладить? Если вы не можете использовать отладчик, добавьте распечатки. Например, проверьте / распечатайте значение rawLength
, длину dat
после того, как вы прочитали его из raw
файла. Я предполагаю, что dat
не '\0'
прекращено, но вы можете понять это без помощи Stackoverflow. — person person the human schedule 23.05.2020
Неясно, подходит ли содержимое файла для atoi
; в любом случае он не должен вылетать, если dat не завершается нулевым символом. Добавьте memset (dat, 0, sizeof (dat));
сразу после объявления char dat[rawLength + 1];
. В худшем случае массив будет содержать 0 в последней позиции. — person person the human schedule 23.05.2020
fread
ничего не читает. После fgetc
return EOF
это конец файла — больше нечего fread
. Какое значение имеет rawLength
? Кроме того, я не верю, что вы понимаете, что делает atoi
. Чего вы ждете на выходе? Хранит ли файл строку с нулевым завершением? — person person the human schedule 23.05.2020
спасибо @KamilCuk за подсказку, но у меня все еще та же проблема на той же строке. — person person the human schedule 23.05.2020
Насколько я понимаю, atoi преобразует строку char * в целое число. Поэтому я думаю, что символы вне «0-9» не будут работать. Я проверю шестнадцатеричный и двоичный код позже.
что вы подразумеваете под символами вне «0-9»? — person person the human; 24.05.2020
действительно сожалею о путанице. я хотел сделать атой (* …), а не атой (& …). Я только что исправил это в редактировании. — person person the human; 25.05.2020
то, что я пытаюсь сказать, это 1 и ‘1’, разные, поэтому при использовании atoi () для преобразования он ожидал бы строку, состоящую из символов 0-9, а не int 0-9, если 1-й символ вашего файла был 0xff, тогда он возвращает число, но 0xff — это ascii [0xff]. — person person the human; 25.05.2020
Ok. Спасибо за объяснение. Я изменил
data[i][j] = atoi(*dat[i + j]);
наdata[i][j] = atoi(*((string)dat[i + j]));
, но он по-прежнему не работает [: ‹]. — person person the human; 27.05.2020Для чтения данных из файла используйте обычный fread (..). Если вы уверены, что это строка чисел, используйте atoi. тогда подпись jpeg, которую я видел, была шестнадцатеричной, а не шестнадцатеричной. — person person the human; 30.05.2020