如何将扫描的结构正确打印到文件中?(C)
我正试图使用如何将扫描的结构正确打印到文件中?(C),c,pointers,structure,C,Pointers,Structure,我正试图使用结构和打印将2个文件(f1.txt和f2.txt)读取到第三个文件(f3.txt),但似乎出现了一些错误。在我尝试将值打印到文件(fprintf命令)之前,没有出现问题,我似乎找不到解决方法 这是一个家庭作业,但由于我已经努力解决这个问题几个月了(是的,我很糟糕),我想这里的任何人都知道我如何解决这个问题 #include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <s
结构和打印将2个文件(f1.txt和f2.txt)读取到第三个文件(f3.txt),但似乎出现了一些错误。在我尝试将值打印到文件(fprintf命令)
之前,没有出现问题,我似乎找不到解决方法
这是一个家庭作业,但由于我已经努力解决这个问题几个月了(是的,我很糟糕),我想这里的任何人都知道我如何解决这个问题
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define MAX_NIME_PIKKUS 100
#define MAX_AINE_PIKKUS 100
#define MAX_KOOD 10
#define MAX_HINNE 5
#define DEBUG 0
int n;
int m;
struct Tudeng{
char Nimi[MAX_NIME_PIKKUS];
char Kood[MAX_KOOD];
};
struct Tudeng *pTudeng;
struct Aine{
char Nimetus[MAX_AINE_PIKKUS];
char aineKood[MAX_KOOD];
};
struct Aine *pAine;
struct Tud{
char Tudengikood[MAX_KOOD];
int Hinne[MAX_HINNE];
};
struct Tud *pTud;
char f1[] = "f1.txt";
char f2[] = "f2.txt";
char f3[] = "f3.txt";
FILE *fp1,*fp2,*fp3;
int sisendf1_kontroll();
int sisendf2_kontroll();
void tekita_failid();
void andmed_failidesse(char Tudeng1, char Tudeng2, char Aine1, char Aine2, char Tud1, int Tud2);
int main(void){
int a;
int b;
int c;
n = sisendf1_kontroll();
printf("Failist %s loeti %d tudengi andmed.\n", f1, n);
m = sisendf2_kontroll();
printf("Failist %s loeti %d aine andmed.\n", f2, m);
fp1 = fopen(f1,"r");
fp2 = fopen(f2, "r");
int i = 0;
a = sizeof(struct Tudeng);
b = sizeof(struct Aine);
c = sizeof(struct Tud);
pTudeng = malloc(a * n);
pAine = malloc(b * m);
pTud = malloc(c * m);
if(DEBUG)printf("Struktuuri Tudeng baidi aadress on %p, ühe kirje andmeteks eraldati mälu %d baiti, mälu eraldati massiivile kokku %d baiti \n", pTudeng, a, a * n);
if(DEBUG)printf("Struktuuri Aine baidi aadress on %p, ühe kirje andmeteks eraldati mälu %d baiti, mälu eraldati massiivile kokku %d baiti \n", pAine, b, b * m);
if(DEBUG)printf("Struktuuri Tud baidi aadress on %p, ühe kirje andmeteks eraldati mälu %d baiti, mälu eraldati massiivile kokku %d baiti \n", pTud, c, c * m);
int loopiks;
while(loopiks == 0){
while(!feof(fp1)){
fscanf(fp1,"%s",(pTudeng+i)->Nimi);
fscanf(fp1,"%s",(pTudeng+i)->Kood);
i++;
}
while(!feof(fp2)){
fscanf(fp2,"%s",(pAine+i)->Nimetus);
fscanf(fp2,"%s",(pAine+i)->aineKood);
fscanf(fp2,"%s",(pTud+i)->Tudengikood);
fscanf(fp2,"%d",(pTud+i)->Hinne);
i++;
}
loopiks = 1;
tekita_failid();
andmed_failidesse((pTudeng+i->Nimi), (pTudeng+i)->Kood, (pAine+i)->Nimetus, (pAine+i)->aineKood, (pTud+i)->Tudengikood, (pTud+i)->Hinne);
free(pTudeng);
free(pAine);
free(pTud);
}
//fprintf(fp3, "%s %s\n",(pTudeng+i)->Nimi,(pTudeng+i)->Kood);
fclose(fp1);
fclose(fp2);
return 0;
}
int sisendf1_kontroll(void){
char rida[122];
int n = 0, p;
fp1 = fopen(f1,"r");
if(fp1 == NULL){
printf("Sisendfaili %s avamine ebaonnestus!", f1);
exit(1);
}else{
while(!feof(fp1)){
fgets(rida, 122, fp1);
p = strlen(rida);
if (p > 1) n++;
}
}
fclose(fp1);
return n;
}
int sisendf2_kontroll(void){
char rida2[122];
int m = 0, o;
fp2 = fopen(f2,"r");
if(fp2==NULL){
printf("Sisendfaili %s avamine ebaonnestus!", f2);
exit(1);
}else{
while(!feof(fp2)){
fgets(rida2, 122, fp2);
o = strlen(rida2);
if (o > 1) m++;
}
}
fclose(fp2);
return m;
}
void tekita_failid(){
fp3 = fopen(f3, "w");
fclose(fp3);
return;
}
void andmed_failidesse(char Tudeng1, char Tudeng2, char Aine1, char Aine2, char Tud1, int Tud2){
fp3 = fopen(f3, "a");
int i;
int j;
while(i < n && j < m){
for(i = 0; i < n; i++){
fprintf(fp3, "%s %s ",(pTudeng+i)->Nimi,(pTudeng+i)->Kood);
}
for(j = 0; j < m; j++){
fprintf(fp3, "%s %s %s %d \n",(pAine+i)->Nimetus,(pAine+i)->aineKood, (pTud+i)->Tudengikood, (pTud+i)->Hinne);
}
}
return;
}
#包括
#包括
#包括
#包括
#包括
#定义MAX_NIME_PIKKUS 100
#定义MAX_AINE_PIKKUS 100
#定义最大值10
#定义MAX_HINNE 5
#定义调试0
int n;
int m;
图登结构{
查尼米[马克斯·尼姆·皮库斯];
查尔·库德[马克斯·库德];
};
结构图邓*图邓;
结构{
查·尼梅特斯[马克斯·艾因·皮库斯];
查·艾尼库德[马克斯·库德];
};
结构图*pAine;
结构图{
查尔·图登基伍德[MAX_KOOD];
int Hinne[MAX_Hinne];
};
结构Tud*pTud;
字符f1[]=“f1.txt”;
字符f2[]=“f2.txt”;
char f3[]=“f3.txt”;
文件*fp1、*fp2、*fp3;
int sisendf1_kontroll();
int sisendf2_kontroll();
void tekita_failid();
void和med_failidesse(char Tudeng1、char Tudeng2、char Aine1、char Aine2、char Tud1、int Tud2);
内部主(空){
INTA;
int b;
INTC;
n=sisendf1_kontroll();
printf(“故障列表%s loeti%d tudengi and med.\n”,f1,n);
m=sisendf2_kontroll();
printf(“故障列表%s loeti%d aine and med.\n”,f2,m);
fp1=fopen(f1,“r”);
fp2=fopen(f2,“r”);
int i=0;
a=sizeof(struct Tudeng);
b=尺寸(结构);
c=sizeof(结构图);
pTudeng=malloc(a*n);
pAine=malloc(b*m);
pTud=malloc(c*m);
如果(调试)printf(“安装在%p上的Struktuuri-Tudeng-baidi-Aaddress,u he-kirje和Meteks-eraldati mälu%d baiti,mälu-eraldati-Massiville kokku%d baiti”;
如果(调试)printf(“在%p,u he kirje and meteks eraldati mälu%d baiti,mälu eraldati massiville kokku%d baiti\n上绘制的结构图”,pAine,b,b*m);
如果(调试)printf(“在%p上的Struktuuri Tud baidi aadress,u he kirje and meteks eraldati mälu%d baiti,mälu eraldati massiville kokku%d baiti”,pTud,c,c*m);
int-loopiks;
while(loopiks==0){
而(!feof(fp1)){
fscanf(fp1,“%s”,(ptuden+i)->Nimi);
fscanf(fp1,“%s”,(ptuden+i)->Kood);
i++;
}
而(!feof(fp2)){
fscanf(fp2,“%s”,(pAine+i)->尼美图斯);
fscanf(fp2,“%s”,(pAine+i)->aineKood);
fscanf(fp2,“%s”,(pTud+i)->图登基伍德);
fscanf(fp2,“%d”,(pTud+i)->Hinne);
i++;
}
loopiks=1;
tekita_failid();
和Med_failidesse((pTudeng+i->Nimi),(pTudeng+i)->Kood,(pAine+i)->Nimetus,(pAine+i)->aineKood,(pTud+i)->Tudengikood,(pTud+i)->Hinne);
免费(许可证);
免费(止痛);
免费(pTud);
}
//fprintf(fp3,“%s%s\n”,(pTudeng+i)->Nimi,(pTudeng+i)->Kood);
fclose(fp1);
fclose(fp2);
返回0;
}
int sisendf1_kontroll(无效){
char-rida[122];
int n=0,p;
fp1=fopen(f1,“r”);
如果(fp1==NULL){
printf(“Sisendfaili%s avamine eBoannestus!”,f1);
出口(1);
}否则{
而(!feof(fp1)){
fgets(rida,122,fp1);
p=斯特伦(里达);
如果(p>1)n++;
}
}
fclose(fp1);
返回n;
}
int sisendf2_kontroll(无效){
char-rida2[122];
int m=0,o;
fp2=fopen(f2,“r”);
如果(fp2==NULL){
printf(“Sisendfaili%s avamine eBoannestus!”,f2);
出口(1);
}否则{
而(!feof(fp2)){
fgets(rida2、122、fp2);
o=strlen(rida2);
如果(o>1)m++;
}
}
fclose(fp2);
返回m;
}
void tekita_failid(){
fp3=fopen(f3,“w”);
fclose(fp3);
返回;
}
void和med_failidesse(char Tudeng1、char Tudeng2、char Aine1、char Aine2、char Tud1、int Tud2){
fp3=fopen(f3,“a”);
int i;
int j;
而(iNimi,(pTudeng+i)->Kood);
}
对于(j=0;j尼美图斯,(pAine+i)->阿涅库德,(pTud+i)->图登吉库德,(pTud+i)->希恩;
}
}
返回;
}
我希望程序将信息从f1.txt和f2.txt输出到f3.txt,但当前编译器告诉我,我不能这样做,因为我在上一个函数中使用了*int
,但它说需要常规int。编译器是正确的:
和med_failidesse
需要一个int
作为最后一个参数,您正在传递Hinne
,它是int
的数组,也称为int*
由于当前代码中没有使用Tud2
,您可以将其从函数签名中删除,或者重新编写函数以使用它。
编译器还应该警告您,函数中还有其他未使用的参数
这显然是一项正在进行的工作:休息一下,重新阅读你的C课程,并尝试找出你的函数应该做什么,以及它需要哪些参数。首先,请学习如何创建一个C。其次,请阅读,以及。也请不要使用全局变量。如果多个函数需要使用它们,则将它们作为参数传递。另外,请阅读未能检查每个fscanf
的返回将导致未定义的行为。请注意上面@Someprogrammerdude的评论。