[英]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.