簡體   English   中英

如何在C中的調用函數中使用文件指針

[英]How to use a file pointer in a called function in C

我寫了一些代碼作為學校練習。 在此練習中,我們需要使用結構和功能。 我想使用一個函數從文件中讀取一些日期,並將此數據保存到結構中。 接下來,我還有另一個功能可以對此數據進行簡單的計算。 我用fopen在main函數中初始化了我的filepointer,問題是我想在main調用的函數中使用相同的指針。 當我在主函數之外聲明FILE * fp時,程序會編譯,但運行時會崩潰。 有人可以幫我嗎? 謝謝你們。 這是代碼:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int dag;
    int maand;
    int jaar;
}geboortedag;

typedef struct 
{
    char name[BUFSIZ];
    geboortedag dag;
}persoon;

void readperson(persoon *);
geboortedag calculate(p);

int main(int argc, char *argv[])
{
    FILE *fp;
    persoon a;
    persoon *p;
    p = &a;
    geboortedag leeftijd;

    if (argc != 5)
    {
        printf("Het aantal argumenten die ingegeven is niet correct\n");
        getchar();
        exit(1);
    }
    else if (argc == 5)
    {
        if ((fp = fopen(argv[1], "r")) == NULL)
        {
            printf("De file kon niet worden geopend\n");
            getchar();
            exit(2);
        }
    }

    readperson(p);
    leeftijd = calculate(p);
    printf("De leeftijd is %d %d %d", leeftijd.dag, leeftijd.maand,   leeftijd.jaar);
    fclose(fp);
    printf("Het bestand is correct afegsloten");
    getchar();
    return 0;
}

void readperson(persoon *x)
{
    char a[BUFSIZ];
    fgets(a, BUFSIZ, fp);
    strcpy(x->name, a);
    fscanf("%d%d%d", x->dag.dag, x->dag.maand, x->dag.jaar);
}

geboortedag calculate(persoon *x)
{
    geboortedag tijd;
    int a, b, c;
    a = atoi(x->dag.dag);
    b = atoi(x->dag.maand);
    c = atoi(x->dag.jaar);
    tijd.dag = x->dag.dag - a;
    tijd.maand = x->dag.maand;
    tijd.jaar = x->dag.jaar;
    return tijd;
}

編輯:所以我嘗試了這里提出的建議。 我仍然收到有關可能未初始化的文件指針的錯誤...

錯誤C4703可能使用了未初始化的本地指針變量'fp'

這是更新的代碼:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
    int dag;
    int maand;
    int jaar;
}geboortedag;

typedef struct
{
    char name[BUFSIZ];
    geboortedag dag;
}persoon;

void readperson(FILE* fp, persoon *p);
geboortedag calculate(persoon *p);

int main(int argc, char *argv[])
{
    FILE *fp;
    persoon a;
    persoon *p;
    p = &a;
    geboortedag leeftijd;

    if (argc != 5)
    {
        printf("Het aantal argumenten die ingegeven is niet correct\n");
        getchar();
        exit(1);
    }
    else if (argc == 5)
    {
        if ((fp = fopen(argv[1], "r")) == NULL)
        {
            printf("De file kon niet worden geopend\n");
            getchar();
            exit(2);
        }
    }

    readperson(fp, p);
    leeftijd = calculate(p);
    printf("De leeftijd is %d %d %d", leeftijd.dag, leeftijd.maand, leeftijd.jaar);
    fclose(fp);
    printf("Het bestand is correct afegsloten");
    getchar();
    return 0;
}

void readperson(FILE* fp, persoon *x)
{
    char a[BUFSIZ];
    fgets(a, BUFSIZ, fp);
    strcpy(x->name, a);
    fscanf(fp, "%d%d%d", &x->dag.dag, &x->dag.maand, &x->dag.jaar);
}

geboortedag calculate(persoon *x)
{
    geboortedag tijd = { 0, 0, 0 };
    /*int a, b, c;
    a = atoi(x->dag.dag);
    b = atoi(x->dag.maand);
    c = atoi(x->dag.jaar);
    tijd.dag = x->dag.dag - a;
    tijd.maand = x->dag.maand;
    tijd.jaar = x->dag.jaar;*/
    return tijd;
}

最簡單的方法是將文件指針簡單地傳遞給read函數:

void readperson(FILE *fp, persoon *x);

然后在main

readperson(fp, p);

奇怪的是,當您全局聲明fp時,它會崩潰,但是由於您沒有提供更多詳細信息,因此我們將其保留。

只需將文件指針傳遞給需要它的每個過程。 因此,他們的原始人變成了

void readperson(FILE *, persoon *);

他們被稱為

readperson(fp, p);

從主要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM