这是我在这里发表的第一篇文章。我正在用 C 编写一个程序来处理 clown 结果(这是一个像强力球这样的游戏)。下面我只包含对我的问题重要的代码。首先,向程序输入 1,以便它读取先前的结果文件。我将包含该文件,以便您也可以运行它。然后输入 3,以便以
的形式插入结果id;day/month/year;num1;num2;num3;num4;num5;joker
之后输入 99,您会看到完整的结果数组。 问题是附加到 array(resArr) 的前 2 个结果正确显示,但所有后续附加都以伪随机数存储。知道为什么我的代码只适用于 2 次重复吗? 文件:link
#include <stdio.h>
#include <stdlib.h>
typedef struct results
{
int id,date[3],num[5],joker;
}Results;
Results *read()
{
FILE *fp=fopen("joker.csv","r");
Results *temp=(Results *)malloc(sizeof(Results));
Results *result=(Results *)malloc(sizeof(Results));
int i=0,size=1;
while(!feof(fp))
{
char *s=(char *)malloc(50*sizeof(char));
fgets(s,50,fp);
sscanf(s,"%d;%d/%d/%d;%d;%d;%d;%d;%d;%d",&result[i].id,&result[i].date[0],&result[i].date[1],&result[i].date[2],&result[i].num[0],&result[i].num[1],&result[i].num[2],&result[i].num[3],&result[i].num[4],&result[i].joker);
temp=(Results *)realloc(result,(++size)*sizeof(Results));
if (temp) result=temp;
else
{
result=NULL;
break;
}
i++;
}
fclose(fp);
return result;
}
int findLength()
{
FILE *fp=fopen("joker.csv","r");
int len,i=0;
while(!feof(fp))
{
char *s=(char *)malloc(50*sizeof(char));
fgets(s,50,fp);
i++;
}
fclose(fp);
len=i-1;
return len;
}
void eisagogi(Results *resArr,int *len)
{
Results result;
printf("id;dd/mm/yyyy;num1;num2;num3;num4;num5;joker\n");
scanf("%d;%d/%d/%d;%d;%d;%d;%d;%d;%d",&result.id,&result.date[0],&result.date[1],&result.date[2],&result.num[0],&result.num[1],&result.num[2],&result.num[3],&result.num[4],&result.joker);
resArr=(Results *)realloc(resArr,(*len+1)*sizeof(Results));
resArr[*len]=result;
*len=*len+1;
}
void showResults(Results *resArr,int len)
{
int i;
for (i=0;i<len;i++)
{ printf("%d;%d/%d/%d;%d;%d;%d;%d;%d;%d\n",resArr[i].id,resArr[i].date[0],resArr[i].date[1],resArr[i].date[2],resArr[i].num[0],resArr[i].num[1],resArr[i].num[2],resArr[i].num[3],resArr[i].num[4],resArr[i].joker);
}
}
int menuChoose()
{
int choice;
printf("Load results 1\n");
printf("Append result 3\n");
printf("Result array 99\n");
printf("Exit 0\n");
scanf("%d",&choice);
return choice;
}
int main()
{
Results *resArr=(Results *)malloc(sizeof(Results));
int choice,len;
while(1)
{
choice=menuChoose();
switch(choice)
{
case 1:
resArr=read();
len=findLength();
break;
case 3:
eisagogi(resArr,&len);
break;
case 99:
showResults(resArr,len);
break;
case 0:
exit(0);
break;
}
}
return 0;
}
最佳答案
我将您的 feof
更改为 fgets
char s[50];
while (fgets(s, sizeof(s), fp) != 0) {
现在似乎可以添加 3 个结果并显示它们。
#include <stdio.h>
#include <stdlib.h>
typedef struct results {
int id, date[3], num[5], joker;
} Results;
Results *read() {
FILE *fp = fopen("joker.csv", "r");
Results *temp = (Results *) malloc(sizeof(Results));
Results *result = (Results *) malloc(sizeof(Results));
int i = 0, size = 1;
char s[50];
while (fgets(s, sizeof(s), fp) != 0) {
sscanf(s, "%d;%d/%d/%d;%d;%d;%d;%d;%d;%d", &result[i].id, &result[i].date[0], &result[i].date[1],
&result[i].date[2], &result[i].num[0], &result[i].num[1], &result[i].num[2], &result[i].num[3],
&result[i].num[4], &result[i].joker);
temp = (Results *) realloc(result, (++size) * sizeof(Results));
if (temp) result = temp;
else {
result = NULL;
break;
}
i++;
}
fclose(fp);
return result;
}
int findLength() {
FILE *fp = fopen("joker.csv", "r");
int len, i = 0;
while (!feof(fp)) {
char *s = (char *) malloc(50 * sizeof(char));
fgets(s, 50, fp);
i++;
}
fclose(fp);
len = i - 1;
return len;
}
void eisagogi(Results *resArr, int *len) {
Results result;
printf("id;dd/mm/yyyy;num1;num2;num3;num4;num5;joker\n");
scanf("%d;%d/%d/%d;%d;%d;%d;%d;%d;%d", &result.id, &result.date[0], &result.date[1], &result.date[2],
&result.num[0], &result.num[1], &result.num[2], &result.num[3], &result.num[4], &result.joker);
resArr = (Results *) realloc(resArr, (*len + 1) * sizeof(Results));
resArr[*len] = result;
*len = *len + 1;
}
void showResults(Results *resArr, int len) {
int i;
for (i = 0; i < len; i++) {
printf("%d;%d/%d/%d;%d;%d;%d;%d;%d;%d\n", resArr[i].id, resArr[i].date[0], resArr[i].date[1], resArr[i].date[2],
resArr[i].num[0], resArr[i].num[1], resArr[i].num[2], resArr[i].num[3], resArr[i].num[4],
resArr[i].joker);
}
}
int menuChoose() {
int choice;
printf("Load results 1\n");
printf("Append result 3\n");
printf("Result array 99\n");
printf("Exit 0\n");
scanf("%d", &choice);
return choice;
}
int main() {
Results *resArr = (Results *) malloc(sizeof(Results));
int choice, len;
while (1) {
choice = menuChoose();
switch (choice) {
case 1:
resArr = read();
len = findLength();
break;
case 3:
eisagogi(resArr, &len);
break;
case 99:
showResults(resArr, len);
break;
case 0:
exit(0);
break;
}
}
return 0;
}
测试
Load results 1
Append result 3
Result array 99
Exit 0
3
id;dd/mm/yyyy;num1;num2;num3;num4;num5;joker
1768;18/12/2016;11;28;5;9;31;1
Load results 1
Append result 3
Result array 99
Exit 0
3
id;dd/mm/yyyy;num1;num2;num3;num4;num5;joker
1769;18/12/2016;11;28;5;9;31;2
Load results 1
Append result 3
Result array 99
Exit 0
3
id;dd/mm/yyyy;num1;num2;num3;num4;num5;joker
1770;18/12/2016;11;28;5;9;31;3
Load results 1
Append result 3
Result array 99
Exit 0
1
...
1768;18/12/2016;11;28;5;9;31;1
1769;18/12/2016;11;28;5;9;31;2
1770;18/12/2016;11;28;5;9;31;3
Load results 1
Append result 3
Result array 99
Exit 0
关于无法在结构数组中正确追加元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41428227/