Fscanf 与动态数组

Fscanf with Dynamic Arrays

我有问题。每当我尝试从文件读取到动态数组时,值都是随机的。

int* aaNo;
int* bbKod;
int* ccPuan;
int* ddOffset;
 aaNo=(int*)malloc(buffer * sizeof(int));
 bbKod=(int*)malloc(buffer * sizeof(int));
 ccPuan=(int*)malloc(buffer * sizeof(int));
 ddOffset=(int*)malloc(buffer * sizeof(int));
//int aaNo[buffer],bbKod[buffer],ccPuan[buffer],ddOffset[buffer];
int line[100],o=0;
while(fgets(line,sizeof(line),veri))
{
    fscanf(veri,"%d %d %d %d",&aaNo[o],&bbKod[o],&ccPuan[o],&ddOffset[o]);
    o++;
}

这是我要阅读的文件:

9 2 34 4225420
7 4 24 42205436
0 3 62 4225452
0 1 45 4225468
9 1 61 4225484
4 1 42 4225500
8 1 91 4225516
8 2 53 4225532
6 2 21 4225548
4 5 95 4225564
5 5 71 4225580
5 2 12 4225596
1 4 35 4225612
7 3 11 4225628
1 3 73 4225644
1 1 11 4225660
5 3 47 4225676
2 5 57 4225692
7 2 23 4225708
6 4 78 4225724
1 5 90 4225740
4 3 6 4225756
6 3 64 4225772
3 1 5 4225788
2 4 70 4225804
2 1 1 4225820
9 3 29 4225836
6 5 54 4225852
8 3 66 4225868
5 1 8 4225884
7 1 26 4225900
6 1 38 4225916
0 2 29 4225932
8 5 15 4225948
9 5 4 4225964
2 2 6 4225980
7 5 21 4225996
9 4 72 4226012
5 4 77 4226028
4 2 12 4226044
3 2 61 4226060
0 4 67 4226076
2 3 31 4226092
3 5 50 4226108
3 4 66 4226124
4 4 91 4226140
1 2 57 4226156
0 5 83 4226172
3 3 9 4226188
8 4 88 4226204

如果我能得到一些帮助,那将是非常感谢。

您只是每隔一行扫描一次。 while 条件中的 fgets() 读取一行,然后 fscanf() 读取下一行并从中提取变量。

您可以使用 fgets() 读取该行,然后使用 sscanf() 从该行中提取变量。

while(fgets(line,sizeof(line),veri))
{
    sscanf(line,"%d %d %d %d",&aaNo[o],&bbKod[o],&ccPuan[o],&ddOffset[o]);
    o++;
}

或者在while条件下扫描

while(fscanf(veri,"%d %d %d %d",&aaNo[o],&bbKod[o],&ccPuan[o],&ddOffset[o]) == 4)
{
    o++;
}

第二个版本不需要 line 变量。

已测试有效的完整程序:

#include <stdio.h>
#include <stdlib.h>

int main(void){
    FILE *veri;
    veri = fopen("input.txt","r");
    
    int* aaNo;
    int* bbKod;
    int* ccPuan;
    int* ddOffset;

    int buffer=0; 
    int c; 
    for (c = getc(veri); c != EOF; c = getc(veri)) { 
        if (c == '\n') 
            buffer = buffer + 1; 
    }
    fseek(veri, 0, SEEK_SET); // Go back to beginning to re-read file

    aaNo=(int*)malloc(buffer * sizeof(int));
    bbKod=(int*)malloc(buffer * sizeof(int));
    ccPuan=(int*)malloc(buffer * sizeof(int));
    ddOffset=(int*)malloc(buffer * sizeof(int));

    int o=0;
    while(fscanf(veri,"%d %d %d %d",&aaNo[o],&bbKod[o],&ccPuan[o],&ddOffset[o]) == 4)
    {
        o++;
    }
    fclose(veri);

    // Print aray contents
    for (int i = 0; i < buffer; i++) {
        printf("%d %d %d %d\n", aaNo[i], bbKod[i], ccPuan[i], ddOffset[i]);
    }

    return 0;
}