2016-03-23 16 views
0

この質問はよく聞かれましたが、それはどういう仕組みか分かりません。私は私のファイルを自分の構造体内、関数内で読み込み、関数へのポインタを通して構造体を渡したいと思っています。私は関数プロトタイプを書く方法についても不明です。ポインタを使って構造体の配列と構造体の配列を返す -

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

#define MAX 90 
#define STR 200 
#define MAXLEN 40 

struct human { 
    char name[MAXLEN]; 
    char surname[MAXLEN]; 
    int age; 
    float weight; 
}; 
int main(int argc, char *argv[]) { 
    char *dlim= " ", *end = "\n"; 
    char *string; 
    string = (char *)malloc(sizeof(char) * STR); 
    int i = 0, j = 0; 
    struct human *man = malloc(sizeof(struct human) * MAX); 

    FILE *fin = fopen("data.txt", "r"); 
    if (fin == NULL) { 
     printf("Cannot open file\n"); 
     exit(0); 
    } 
    while (fgets (string, STR, fin)){ 
     read (string, &man[i], dlim, end); 
     i++; 
    } 
    fclose(fin); 

    free(string); 
    free(man); 

    return 0; 
} 

struct human *man read(char *fstring, struct *man, char *div, char *end){ 
    int i=0; 
    char *tok; 

     tok = strtok(string, dlim); 
     strcpy(man[i].name, tok); 

     tok = strtok(NULL, dlim); 
     strcpy(man[i].surname,tok); 

     tok = strtok(NULL, dlim); 
     man[i].age = atoi(tok); 

     tok = strtok(NULL, end); 
     man[i].weight = atof(tok); 

    return man[i]; 

} 

機能はどのように見えるのですか?そして、私はポインタの使用を通じて構造体が自動的にmainで更新されると仮定して正しいですか?関数に何かを返す必要はありませんか?

ポインターの使用が自動的にメインに渡されるため、この関数は何も返しません(無効)?

ありがとうございました!

+0

関数の読み込みに何かが返されています。構造体の人間のポインタを返す必要はありません。あなたはすでに記入される構造体へのポインタを渡しています。成功した場合は0を返し、失敗の場合はゼロ以外のエラーコードを返します。これは典型的な動作です。 – bruceg

答えて

2

コードはクローズしていますが、人間の構造を埋めるサブルーチンのポインタロジックが正しくありません。次の再加工とわずかな簡略化が構造を渡す方法を理解するのに役立つかどうか確認してください。

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

#define MAXIMUM_HUMANS 90 
#define MAXIMUM_INPUT_STRING_LENGTH 200 
#define MAXIMUM_STRING_LENGTH 40 

struct human { 
    char name[MAXIMUM_STRING_LENGTH]; 
    char surname[MAXIMUM_STRING_LENGTH]; 
    int age; 
    float weight; 
}; 

void initialize_human(char *string, struct human *man, char *delimiter, char *end) { 
    char *token; 

    token = strtok(string, delimiter); 
    strcpy(man->name, token); 

    token = strtok(NULL, delimiter); 
    strcpy(man->surname, token); 

    token = strtok(NULL, delimiter); 
    man->age = atoi(token); 

    token = strtok(NULL, end); 
    man->weight = atof(token); 
} 

int main(int argc, char *argv[]) { 
    char *dlim= " ", *end = "\n"; 
    char string[MAXIMUM_INPUT_STRING_LENGTH]; 
    struct human humans[MAXIMUM_HUMANS]; 

    FILE *fin = fopen("data.txt", "r"); 

    if (fin == NULL) { 
     fprintf(stderr, "Cannot open file\n"); 
     exit(1); 
    } 

    int population; // after loop, this contains total body count 

    for (population = 0; fgets(string, MAXIMUM_INPUT_STRING_LENGTH, fin); population ++) { 
     initialize_human(string, &humans[population], dlim, end); 
    } 

    printf("population: %d\n", population); 
    printf("last added: %s who weighs %f\n", humans[population - 1].surname, humans[population - 1].weight); // test if we loaded it up correctly 

    fclose(fin); 

    return 0; 
} 
関連する問題