Innacurate чтения файла из fopen и / или fscanf - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь прочитать файл из этого кода. Я пытаюсь загрузить изображения и сохранить их в своей программе в виде строк, чтобы позже я мог создать идентичное изображение с помощью fprintf для нового файла. Мне не разрешено использовать некоторые дубликаты файлов; Мне нужно загрузить файлы в виде строки и записать их в новый файл позже. Я пытаюсь получить массив символов, и, поскольку один символ представляет собой один байт, массив равен размеру файла, и каждый элемент массива символов соответствует одному байту текстуры алмазного блока, и я хочу также быть в состоянии записать эту строку из кода в новый файл и иметь еще один алмазный блок, который я могу открыть с помощью средства просмотра изображений.

#include <stdio.h>
#include <stdlib.h>

char Contents[468];

int main(int argc, char *argv[]) {
    char *WD = getenv("HOME");
    char Path[strlen(WD)+strlen("/Desktop/diamond_block.png")+1];
    sprintf(Path, "%s/Desktop/diamond_block.png", WD);
    FILE *File = fopen(Path, "r");
    fscanf(File, "%s", Contents);
    printf(Contents);
}

Результат - всего четыре буквы, âPNG, и предполагается, что это сотни символов, означающих, что файл НЕ полностью читается. Я подозреваю, что он каким-то образом завершается рано каким-то завершающим персонажем, но как я могу решить мою проблему?

1 Ответ

2 голосов
/ 29 июня 2019

Это очень простой ответ на ваш вопрос. С помощью приведенного ниже кода вы можете понять, в чем ваша проблема. Этот код нуждается в хорошей проверке, чтобы перехватить все ошибки, которые могут возвращать используемые функции. Кстати ... наслаждайся этим!

Код загружает весь файл fname в массив char imgMem. Он вычисляет размер файла для переменной n, выделяет память для массива imgMem (malloc) и затем загружает весь файл в imgMem (fread).

Затем код записывает первые 30 байтов файла в двух форматах:

  • шестнадцатеричное значение байта
  • значение символа, если байт имеет консольное представление (в противном случае выводится .)

Вот код:

#include <unistd.h>
#include <stdio.h>
#include <malloc.h>

int main(void)
{
    const char * fname = "/home/sergio/Pictures/vpn.png";

    FILE * fptr;
    char * imgMem=NULL;
    long n;
    int i;

    fptr=fopen(fname, "r");

    //Determine the file dimension
    fseek(fptr,0,SEEK_END); n=ftell(fptr);

    //Set the file cursor to the beginning
    fseek(fptr,0,SEEK_SET);

    printf("The file is %lu byte long.\n\n",n);

    //Allocate n bytes to load the file
    imgMem = malloc((size_t)n);

    //Load the file
    fread(imgMem,(size_t)n,1,fptr);;

    for(i=0; i<30; i++) {
        printf("[%02X %c] ",
           (unsigned char)imgMem[i],
           (imgMem[i]>31 && imgMem[i]<127)?
               imgMem[i]:'.'
        );

        if ((i+1)%8==0)
            puts("");
    }

    puts("");

    free(imgMem);

    fclose(fptr);

    return 0;
}
...