Если я прочитал изображение с помощью fread и сразу же записал все прочитанные данные в файл, исходный файл (изображение) полностью отличается от вновь записанного файла. - PullRequest
0 голосов
/ 12 июля 2020

Если я прочитал изображение с помощью fread и сразу же записал все прочитанные данные в файл, исходный файл (изображение) полностью отличается от вновь записанного файла. Как написано в топи c эти два файла полностью различаются. Я сравниваю это с hexdump. Не могли бы вы помочь мне? Та же проблема, что и у меня, когда я читаю код из FCGI_getchar. Исходный файл и новый файл отличаются при сравнении шестнадцатеричного дампа.

#include "fcgi_stdio.h"
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int count = 0;
//  char stdinchar;
    char *requestmethod;
    FILE *fptr; 
    FILE *fptr1;
    char *buffer;
    long size;


    while(FCGI_Accept() >= 0) {

        printf("Content-type: text/html\r\n"
        "\r\n"
        "<title>FastCGI Hello!</title>"
        "<h1>FastCGI Hello!</h1>"
        "<p>das ist ein test</p>"
        "Request number %d running on host <i>%s</i>\n",
        ++count, getenv("SERVER_NAME")); 
    
        printf("<form action=\"fcgid-script.fcgi\" method=\"post\" enctype=\"multipart/form-data\">");
        printf("    <label>Wählen Sie eine Datei.");
        printf("        <input name=\"datei\" type=\"file\">"); 
        printf("    </label>");  
        printf("    <button>… und ab geht die Post!</button>");
        printf("</form>\n\n");
    
/*      while ( stdinchar != 0 ) { */
/*      while (stdinchar) { */
        requestmethod = getenv("REQUEST_METHOD");
/*      fptr = fopen("/var/www/hiawatha/picture.jpg","wb"); */

        if (strcmp( requestmethod, "POST") == 0) {
    
/*          printf("<i>content-length:%s</i><i>content-type:%s</i>\n",
            getenv("CONTENT_LENGTH"), getenv("CONTENT_TYPE"));      
            while (FCGI_getchar() != EOF ) { 
*/  
    
            fptr = fopen("/home/josef/Pictures/1925.jpg", "rb");
            fptr1 = fopen("/home/josef/Pictures/test123.jpg", "w+b");
            fseek (fptr , 0 , SEEK_END);
            size = ftell(fptr);
            rewind(fptr);   

//          while (!feof(fptr)) {

            fread(buffer, 1, size, fptr);
            fwrite(buffer, 1, size, fptr1);

            fclose(fptr);
            fclose(fptr1);
//      }
    
//          stdinchar = (char) FCGI_getchar(); 
        
//          printf("%c", stdinchar); 
/*          fprintf(fptr,"%d",stdinchar); */
/*          fwrite(&stdinchar, 1, sizeof(stdinchar), fptr); */
        
    
/*          printf("<p>das ist ein test</>"); */

//      }

/*      fclose(fptr);  */   
    
        } 
    }    

    return 0;
}

1 Ответ

2 голосов
/ 12 июля 2020

Конечно, одна проблема здесь в том, что вы читаете файл в память, на которую указывает buffer, но это неинициализированный указатель - вы не выделили никакой реальной памяти для буфера, поэтому вы чтение файла и копирование этих байтов в произвольную память, что плохо. Я впечатлен тем, что, похоже, он работает до конца без полного сбоя. Но в любом случае вам необходимо:

buffer = malloc(size); 

, чтобы выделить фактическое буферное пространство, прежде чем выполнять fread. Затем убедитесь, что вы free(buffer); позже, когда закончите его использовать. Это может или не может решить любые другие проблемы, которые у вас есть, но это необходимо.

...