Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将逗号分隔的文本文件放入结构数组中_C_Arrays_Struct - Fatal编程技术网

C 将逗号分隔的文本文件放入结构数组中

C 将逗号分隔的文本文件放入结构数组中,c,arrays,struct,C,Arrays,Struct,这是一个C语言的家庭作业,让我抓狂!我已经研究了差不多两天了,还没有让它工作,所以非常感谢任何帮助 以下是场景: 我有一个逗号分隔的文本文件,如下所示: (2005 TS15),2013-Apr-07,15.2,0.0391,8.0,0.0205,20.61,20.61,1890,21,13,APO*,0.479,M (2010 GM23),2013-Apr-13,3.9,0.0099,0.9,0.0022,13.14,13.12,61600,24.7,7,APO*,0.195,M (2009 

这是一个C语言的家庭作业,让我抓狂!我已经研究了差不多两天了,还没有让它工作,所以非常感谢任何帮助

以下是场景: 我有一个逗号分隔的文本文件,如下所示:

(2005 TS15),2013-Apr-07,15.2,0.0391,8.0,0.0205,20.61,20.61,1890,21,13,APO*,0.479,M
(2010 GM23),2013-Apr-13,3.9,0.0099,0.9,0.0022,13.14,13.12,61600,24.7,7,APO*,0.195,M
(2009 SQ104),2013-Apr-22,27.8,0.0714,27.8,0.0714,8.16,8.15,67300,20.9,19,APO*,0.408,S
(2012 XF55),2013-Apr-22,32.7,0.0841,32.7,0.0840,7.33,7.33,15600,22.5,7,APO*,0.446,M
该文件中有10000条ish记录(其数据与近地天体有关)

我需要能够找到10个最大的对象/10个最近的对象等,因此我的计划是将数据读入一个结构数组,每个结构基于文件中的列。我已经创建了结构,并创建了它的实例来从文件中填充

我的问题在最后的一般功能中。。。我想

我尝试过将结构的完整数组初始化为结构的空白实例,但没有任何效果

我尝试将每一行作为字符串读入,然后根据符号对其进行标记,但我不知道如何将标记保存到结构的每个元素(这是注释掉的结尾部分…)

我尝试使用
fread()
将文件读入结构数组,但也没有发生任何事情(这是注释掉的结尾部分…)

我的代码如下。如果有人能给我指出正确的方向,我将非常感激!!(我希望格式可以。如果我没有正确解释问题,请告诉我,我会的!!!)

#包括
#包括
#包括
#包括
#定义记录10972/*文件中的记录数*/
类型定义结构{
char*objectName;
char*CADate;
双列名;
双号;
双重意识;
双重心态;
国际VRel;
国际葡萄酒协会;
国际非标准化组织;
浮动HVm;
int-ref;
char*ObjClass;
双倍直径;
字符*类型;
}近地天体;
NEO文本文件[记录];
近地天体通过[记录];
无效菜单();
无效计数文件(文件*fptr);
作废一般文件(文件*fptr);
内部主(空)
{
字符文件名[50];
智力选择;
文件*fptr;
printf(“输入要打开的文件名:\n”);
scanf(“%s”和文件名);
fptr=fopen(文件名,“r”);
如果(fptr!=NULL)
printf(“文件%s已成功打开!\n\n”,文件名);
其他的
printf(“未找到文件%s!\n”,文件名);
countFile(fptr);
做
{
菜单();
选择=0;
while(选项5)
{
printf(“\n从上面(1-5)中选择一个选项):\n”);
scanf(“%d”,选择(&C);
}
开关(选择)
{
案例1:
printf(“函数最大\n”);
打破
案例2:
printf(“函数最近\n”);
打破
案例3:
printf(“函数”\n);
打破
案例4:
一般事务(fptr);
打破
违约:
打破
}
}
while(选项!=5);
printf(“\n\n程序正在退出。再见!\n\n”);
fclose(fptr);
返回0;
}
作废一般文件(文件*fptr)
{
int count=0,fileEnd=0,i=0,test=0;
字符数组;
char hold[200];/*字符串用于保存标记化字符串*/
char temp[10000];/*字符串,用于在读取每个记录时保存该记录*/
查普顿;
const char*delim=“,”;/*定义分隔符以标记每个记录*/
传递->对象名称=”;
通过->卡达特=”;
通过->NomDistLD=0.0;
通过->NomDistAU=0.0;
通过->MinDistLD=0.0;
通过->MinDistAU=0.0;
通过->VRel=0;
通过->VIN=0;
通过->NSig=0;
通过->HVm=0.0;
通过->参考=0;
通过->对象类=”;
通过->直径=0.0;
通过->类型=”;

对于(i=0;i您的问题很可能是将字符串复制到内存的随机区域,因为您从未初始化
objectName
CADate
指针

您最好用实际数组替换这些指针:

char objectName[128];
char CADate[128];
我读了每一行

然后向前扫描,直到找到“.Replace each”,并将其替换为\0。保留每个的计数

使用count调用不同的sscanf函数,将不同的字段加载到当前结构中。字段的字符串类型需要标准化,以便为其分配内存

作为一个快速测试,请使用较短版本的csv文件(例如4行),并使用断言功能检查预期值是否进入结构

最好使用perl或python之类的脚本语言来解决此类问题


希望这有帮助!

您不能使用strcpy,因为您没有在结构中分配字符串。您可以使用strdpy(即
textFile[i].objectName=strdpy(pToken);
)您也不需要初始化数组,只需跟踪加载条目的计数。我想我真的要哭了…它似乎起了作用!!我的分配代码(因为缺少更好的描述)现在是:while(!feof(fptr)){for(I=0;iso,感谢Joachim提供的strdup提示!)感谢你的支持,我使用了一个测试文件,它使调试变得更容易(哦!)我按照Joachim的建议使用了strdup,它似乎已经工作了。感谢你放松(我使用了strdup,它似乎已经工作了!)
char objectName[128];
char CADate[128];