2017-07-27 4 views
-3

私は関数呼び出しを適切に行うために関数を呼び出すと思うのですが、 freadはメモリのチャンクに正しく読み込むことができないため、セグメンテーションフォルトが生成されます]!正しいアプローチに私を指すくださいファイルの内容をメモリに渡すことに問題がある

コードへlink

#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; 
} 

は、ファイルを開いていることを確認する必要がありますあなたに

+1

[Minimal、Complete、and Verifiable example](https://stackoverflow.com/help/mcve)をそれにリンクしています。リンクにはコードが含まれていますが、将来的には古くなる可能性があります。 – litelite

+0

しかし、私はこのリンクが素敵だと言わざるを得ないが、コードを見てデバッグすることができる本当のIDEだ - 私はそれが消えてしまうことは知っているが、それでも非常に簡単に答えることができると思うよ – pm100

+1

'load'がfalseを返す場合、あなたは単に続行します。そして、fopenがうまく働いているかどうかは決して確認しないでください。 – pm100

答えて

0

に感謝ですOK

第2に、ロード関数が失敗した場合はfalseを返しますが、チェックしないでください。あなたは

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

    } 

を行うが、どのような方法で運ぶ負荷の

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

を行います。あなたのプログラムが失敗したときには、一般的には

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

はあなたが呼び出す任意の関数、fseek関数の戻り値をチェックしていない行う必要があり、ftellは、関数freadは、...あなたは驚いてはいけません。はい、それは退屈なスローグですが、それはちょうどそれがCの土地にある方法です

+1

ヘッドアップありがとう。クリーンアップ.... –

関連する問題