无法在结构数组中正确追加元素

标签 c arrays

这是我在这里发表的第一篇文章。我正在用 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/

相关文章:

c - 结构体和 fprintf()

c - 您希望应用程序接受传入的网络连接吗?

c - 如何仅使用printf和3个变量按升序排列整数?

perl - 如何使用 Perl 中的引用复制数组?

java - 反序列化多维数组GSON

c - 指向结构体的指针中的元素数量

shell - 在 Mac 终端上的 C 编译器中以无限循环创建并行算术运算符

arrays - 如何将简单(平面)数组转换为多维(2D)数组

javascript - 嵌入的 Discord.js 按钮

c - C编程中数组中缺少数字