c读取txt到结构体数组,结果输出全为0
FILE *data ;
int i=0;
char line[100];
struct Player players[MAX];
if((data=fopen("Player_Info.txt","r"))==NULL){
printf("can not open file\n");
return ;
}
// 跳过前4行
for (int j = 0; j < 4; j++) {
fgets(line, sizeof(line), data);
}
while (i<=100) {
sscanf(line, "%d %s %d %d %d %d %d %d %d %d %d %d %d",
&players[i].id, players[i].name, &players[i].gender,
&players[i].scores[0], &players[i].scores[1],
&players[i].scores[2], &players[i].scores[3],
&players[i].scores[4], &players[i].scores[5],
&players[i].scores[6], &players[i].scores[7],
&players[i].scores[8], &players[i].scores[9]);
i++;
}
fclose(data);
// 输出读取到的数据
for (int j = 0; j < i; j++) {
printf("%d %s %d ", players[j].id, players[j].name, players[j].gender);
for (int k = 0; k < 10; k++) {
printf("%d ", players[j].scores[k]);
}
printf("\n");
}
针对问题描述中的具体情境,参考资料中给出了两种解决方法:
针对问题描述,我们可以从两个方向入手:
下面会分别针对这两个方向给出建议和代码实现。
方向一:检查代码是否存在问题
如果你在代码中已经按照参考资料中的方式读取txt文件,并将读取的数据存储在结构体数组中,但是输出的结果全是0,那么可以考虑以下问题:
解决方案:
示例代码:
#include<stdio.h>
#include<stdlib.h>
//定义一个结构体
struct test{
int num;
double value;
};
int main(){
int len=5;
struct test mydata[len];
FILE* fp;
fp=fopen("test.txt","r");
//确保文件读取成功
if(fp==NULL){
printf("无法读取文件!");
return 0;
}
//循环读取数据并存储到结构体数组中
for(int i=0;i<len;i++){
fscanf(fp,"%d%lf",&mydata[i].num,&mydata[i].value);
printf("第%d个元素中的num:%d,value:%lf\n",i,mydata[i].num,mydata[i].value);
}
fclose(fp);
return 0;
}
方向二:处理txt文件中的数据格式
如果你的代码实现看起来没有问题,但是输出的结果仍然全是0,那么可以考虑是不是读取的数据格式有问题,导致无法正确地存储到结构体数组中。比如,读取的数据没有按照你所期望的格式进行输出。
如果你在读取txt文件时,遇到了像参考资料中描述的问题,需要按照固定格式读取指定的数据,那么可以采用参考资料中提供的方式进行处理。
解决方案:
示例代码:
#include<stdio.h>
#include<stdlib.h>
//定义一个包含3个坐标的结构体
struct coordinate{
double x;
double y;
double z;
};
int main(){
//定义读取数据的变量
char line[100];
char label[30];
char markers[5][30]={"","Marker#0:","Marker#1:","Marker#2:","Marker#3:"};
double coord[3];
int marker_idx=-1;
//定义存储数据的数组或指针
struct coordinate mydata[4];
//动态分配内存的方式存储
//struct coordinate* mydata=(struct coordinate*)malloc(sizeof(struct coordinate)*4);
//打开文件,按行读取数据
FILE* fp;
fp=fopen("test.txt","r");
//确保文件读取成功
if(fp==NULL){
printf("无法读取文件!");
return 0;
}
while(fgets(line,100,fp)){
//获取数据标签,判断是否为marker
sscanf(line,"%s",&label);
for(int i=1;i<=4;i++){
if(!strcmp(label,markers[i])){
marker_idx=i; //记录当前marker的编号
break;
}
}
//如果当前标签为坐标数据,则解析该行数据并存储到数组中
if(marker_idx>0){
sscanf(line,"%*s (%lf,%lf,%lf)",&coord[0],&coord[1],&coord[2]);
mydata[marker_idx].x=coord[0];
mydata[marker_idx].y=coord[1];
mydata[marker_idx].z=coord[2];
}
}
fclose(fp);
//输出读取到的数据
for(int i=0;i<4;i++){
printf("Marker #%d的三个坐标信息:(%lf,%lf,%lf)\n",i,mydata[i].x,mydata[i].y,mydata[i].z);
}
//释放动态分配的内存
//free(mydata);
return 0;
}
总结:
这么改,供参考:
void readfile()
{
FILE *data ;
int i = 0;
char line[1024]={0}; //修改
struct Player players[MAX];
if((data=fopen("Player_Info.txt","r"))==NULL){
printf("can not open file\n");
return ;
}
// 跳过前4行
for (int j = 0; j < 4; j++) {
fgets(line, sizeof(line), data);
}
while (i<=100) {
for (int j = 0;j < 1024; j++) line[j] = 0;
if (fgets(line, sizeof(line), data) == NULL) break;
sscanf(line, "%d %s %d %d %d %d %d %d %d %d %d %d %d",
&players[i].id, players[i].name, &players[i].gender,
&players[i].scores[0], &players[i].scores[1],
&players[i].scores[2], &players[i].scores[3],
&players[i].scores[4], &players[i].scores[5],
&players[i].scores[6], &players[i].scores[7],
&players[i].scores[8], &players[i].scores[9]);
i++;
}
fclose(data);
// 输出读取到的数据
for (int j = 0; j < i; j++) {
printf("%d %s %d ", players[j].id, players[j].name, players[j].gender);
for (int k = 0; k < 10; k++) {
printf("%d ", players[j].scores[k]);
}
printf("\n");
}
}