Я пытаюсь написать простой код С, который подсчитывает, сколько раз байт повторяется в файле. Мы попробовали код с файлами .txt и творят чудеса (максимальный размер: 137 МБ). Но когда мы попробовали его с изображением (даже маленьким, 2 КБ), он вернул Ошибка сегментации 11.Ошибка сегментации 11 при попытке чтения байта изображения за байт
Я провел некоторое исследование и нашел некоторые конкретные библиотеки для изображений, но я не хочу прибегать к ним, поскольку код предназначен не только для изображений, но и для практически любого типа файлов. Есть ли способ просто прочитать байт файла на каждый байт, независимо от чего-либо еще (расширение, мета и т. Д.).
Это код:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
FILE *f;
char *file;
long numTotalBytes = 0;
int bytesCount[256] = {0};
f = fopen (argv[1], "rb");
fseek(f, 0L, SEEK_END);
numTotalBytes = ftell(f);
rewind(f);
file = calloc(1, numTotalBytes);
fread(file, numTotalBytes, 1, f);
fclose(f);
printf("numTotalBytes: %ld", numTotalBytes); //<- this gives the right output even for images
unsigned int i;
for (i=0; i<numTotalBytes; ++i) {
unsigned char pointer = file[i]; //<- This access fails at file[1099]
int pointer_int = (int)pointer;
printf("iteration %i with pointer at %i\n", i, pointer_int); //<- pointer_int is never below 0 or above 255
//++bytesCount[(int)file[i]];
++bytesCount[pointer_int];
}
free(file);
}
Некоторые дополнительные сведения:
- Изменение расширение IMG, чтобы .txt не работает.
- Код возвращает ошибку сегментации точно на итерации 1099 (файл, который я использую, равен aprx 163 КБ, поэтому файл [i] должен принимать обращения до aprox-файла [163000]).
- Для файлов txt работает отлично. Читает байты один за другим и считает их ожидаемыми, независимо от размера файла.
- Я на Mac (вы никогда не знаете ...)
// EDIT: Я редактировал код более desglosed и пояснительная один, потому что некоторые из вас, где говорит мне, что я уже пробовал ,
// EDIT_2: Хорошо, ребята, неважно. Эта версия должна работать на любом другом компьютере, чтобы она не моя. Я думаю, проблема связана с моим терминалом при передаче аргументов, но я просто переключил ОС и работает.
расширение действительно ничего не значит ... –
Попробуйте изменить '(int)' to '(unsigned)'. Вам не нужны отрицательные индексы. – alk
'fseek()' и 'ftell()' не является хорошим способом рассчитать размер файлов. [FIO19-С. Не используйте fseek() и ftell() для вычисления размера обычного файла - CERT C Coding Standard - Стандарты безопасного кодирования CERT] (https://www.securecoding.cert.org/confluence/display/c/FIO19- C. + Do + not + use + fseek() + и + ftell() + to + compute + + + + + + + + + файл) – MikeCAT