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;
}
我有问题。每当我尝试从文件读取到动态数组时,值都是随机的。
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;
}