Отображение содержимого файла в C - ошибка доступа при записи - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь распечатать все содержимое файла в C, который был сохранен в предыдущей функции.Размер файла был прочитан, и динамическое распределение памяти использовалось соответственно, чтобы создать пространство относительно размера файла.Затем указатель (fp) использовался для указания на вновь выделенное пространство.Затем содержимое файла было прочитано в новое пространство.(Я думаю, что именно здесь моя ошибка).

// gloabl variables
unsigned char *fp = 0;          //pointer to navigate through the opened file.
unsigned char *fileStart = 0;   // pointer to save the start address of the file, in case you need to go back to start of file
unsigned char fileSize = 0;     // stores the size of file

/*   Use dynamic memory allocation to store the entire contents of the file and let that memory be pointed by 'fp'.
Save the start of file in 'fileStart' so that you use it to go to start of file in other functions.
After opening the file, read the file size and use it for dynamic memory allocation to read entire file.  */
void loadFile(const char *filename)
{
    FILE *p = fopen(filename, "rb");
    if (p == NULL) {
        printf("File not created, errno = %d\n", errno);
        return 1;
    }
    fseek(p, 0, SEEK_END); // seek to end of file
    fileSize = ftell(p); // get current file pointer
    fseek(p, 0, SEEK_SET); // seek back to beginning of file
    printf("File loaded. File size = %#x bytes\n", fileSize);
    fp = malloc(fileSize + 1);
    fread(fp, fileSize, 1, p);
    fileStart = &fp;
    fclose(p);
}

/*Display file in hex.
Display neatly the content of the file as seen in hex editor.
Even after closing the file with fclose(), we have the contents of the file in memory pointed by 'fp' (or 'fileStart' in loadFile()).
So you don't have to open and read the file again.*/
void displayBmpFile()
{
    printf("Hex view of loaded bmp file: \n");
    while(!feof(fileStart))
        printf("%d\t", fgetc(fileStart));
}

Я понимаю, что ошибка в моей первой функции.Во-первых, я не уверен, правильно ли хранилось содержимое файла.Если содержимое было сохранено правильно, правильно ли fp указывает на файл?Наконец, если все ранее работало правильно, правильно ли fileStart указывает на начало файла?(Файл представляет собой небольшой шестнадцатеричный файл четырех квадратных цветов).

1 Ответ

0 голосов
/ 14 апреля 2019

изменить unsigned char fileSize = 0; на size_t fileSize = 0; (ваше растровое изображение наверняка будет больше 255 байт.) Затем (2) в void displayBmpFile() do size_t n = fileSize; unsigned char *p = fileStart; и while (n--) printf("%hhu\t", *p++);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...