2017-07-27 2 views
-3

Ich frage mich, warum, während ich denke, dass ich die Funktionsaufruf ordnungsgemäß laden, scheint es, dass fread kann nicht in meinem Stück Speicher richtig lesen und so erstellt einen Segmentierungsfehler [in Ladefunktion ]! Bitte zeigen Sie mir den richtigen AnsatzDateiinhalt in den Speicher übergeben ist fehlerhaft

der link zum Code ist

#include <math.h> 
#include <signal.h> 
#include <stdbool.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <strings.h> 

bool load(FILE* file, char** content, size_t* length); 

int main() 
{ 
    // opens file 
    FILE * file = fopen("test.txt", "r"); 

    // initialises variables 
    char* content; 
    size_t length; 

    // sending arguments to load function 
    bool receive = load(file, &content, &length); 

    // debugging content 
    printf("values of content: %s\n", content); 

    // debugs length 

    printf("values of content: %zu\n", length); 

    // closes file 
    fclose(file); 

    // for success 
    return 0; 
} 

bool load(FILE* file, char** content, size_t* length) 
{ 

    { 

    // proof checking for the existence of file 
    if (file == NULL) 
     { 
      return false; 
     } 

    // perusing to end of file 
    fseek(file, 0, SEEK_END); 

    // for approximation of size of file  
    size_t len = ftell(file); 

    // returns cursor to beginning of file 
    fseek(file, 0, SEEK_SET); 

    // apportions memory on heap for content of file 
    * content = (char *) malloc (len + 1); 

    // memory error checking 

    if(*content == NULL) 
    { 
     printf("It's unfortunate\n"); 

    } 
    // to read into content  
    fread(* content, sizeof(char), len, file); 

    // null terminates content 
    (* content)[len] = 0; 

    // debugs content  
    printf(" content contains %s\n", * content); 

    // debugs length  
    * length = len; 

    printf(" length is %d\n", * length); 

    // if success 
    return true; 

    } 

    // if fail 
    return false; 
} 

Sie

+1

Bitte post ein [Minimal, vollständige und überprüfbare Beispiel] (https://stackoverflow.com/help/mcve) direkt in die Frage statt Verbindung zu ihm. Während der Link Ihren Code enthält, wird er in der Zukunft möglicherweise veraltet sein. – litelite

+0

obwohl ich sagen muss, dass dieser Link nett ist, eine echte IDE, wo ich den Code sehen und es debuggen kann etc. - Ich weiß, dass es verschwinden wird usw. Aber auch so ist Antworten sehr einfach – pm100

+1

gut der offensichtlichste Fehler ist das Wenn 'load' false zurückgibt, mach einfach weiter. Und Sie überprüfen nie, ob fopen funktioniert entweder – pm100

Antwort

0

Vielen Dank, dass die Datei geöffnet OK

überprüfen müssen
FILE * file = fopen("test.txt", "r"); 
    if(file == NULL) 
    { 
     perror("failed to open file: "); 
     exit(1); 
    } 

Zweitens gibt Ihre Ladefunktion false zurück, es schlägt fehl, aber Sie überprüfen es nicht. Sie

bool receive = load(file, &content, &length); 
if(!receive) 
{ 
    fprintf(stderr, "failed to read file"); 
    exit(1); 
} 

Last tun Sie

if(*content == NULL) 
    { 
     printf("It's unfortunate\n"); 

    } 

aber auf jede Art und Weise tragen. Sie tun sollten

if(*content == NULL) 
    { 
     printf("It's unfortunate\n"); 
     return false; 
    } 

Im Allgemeinen sind Sie nicht die Rückkehr von jeder Funktion überprüft Sie anrufen, fseek, ftell, fread, .... Sie sollten nicht überrascht sein, wenn Ihr Programm fehlschlägt. Ja, es ist ein langweiliger Slog, aber genau so ist es in C Land

+1

Danke für das Heads-up. Wird aufräumen .... –