这是我想要做的:
这是我正在使用的结构之一:
typedef struct {
int eventid;
char eventdate[20];
char venuename[20];
char country[20];
int rockid;
} Venue;
在我的main函数中,我有数组设置来接收文本:
Venue *(places[20]);
现在是更复杂的部分。我需要打开文件进行读取(我让它完美地工作),然后为每个条目动态分配内存。我知道我需要使用malloc来做到这一点,但我以前从未使用过它而且有点茫然。以下是我到目前为止的情况:
void load_data(void)
{
char buffer[20]; //stating that each line can't be longer than 20 chars
int i = 0,len; //declaring 2 int variables
FILE * venuePtr=fopen("venueinfo.txt", "r");
if (venuePtr != NULL)
printf("\n**Venue info file has been opened!**\n");
else{
printf("\nPlease create a file named venueinfo.txt and restart!\n");
} //so far so good...
while (!feof(venuePtr)){ //while we have not found the eof key...
fscanf(venuePtr,"%s",buffer); //we scan each line of text
len = strlen(buffer); //find the length (len) of the string
places[i]=(char*)malloc(len+1); //allocate memory space for the word here
strcpy(places[i],buffer); //copy a word into our array
++i; //finally we move on to the next element in the array
} //end while
问题在于while循环,我已经连续工作了2天。我的结构中有5个成员,我认为strcpy可能不起作用。虽然我确信这只是问题的一部分。我只是无法围绕阅读所有内容。文件本身是一个超级简单的txt文件,如下所示:
1 Jan10 Citadel Belgium 8
4 May05 Sunrise Belize 6
3 Jun17 Footloose Brazil 4
答案 0 :(得分:0)
您正在尝试将字符串复制到场地结构中,您希望如何工作? 的strcpy(场地[I],缓冲液);
请举例说明您的文件,您可能需要解析每个元素并将其写入结构成员
答案 1 :(得分:0)
你可以跳过,但最终应该这样做:
使用函数(void),而不仅仅是函数的empty()。你正在使用的视觉工作室允许它,但格式不好。
声明全局变量同样是错误的形式。你想在main中声明它们并传入它们。
最后,你想要回归。从成功运行的main返回0。如果你有一个无效功能,仍然,返回;在函数的最后结束'}'字符之前。
哦,fscan_s不可移植,它是微软的功能。
您实际询问的内容:
现在,解决你的问题。不要分配内存并分配它。您已经为结构和字符串静态分配了内存,方法是使它们具有给定数量的字符。如果要静态分配内存,则需要使用指针。
如果您扫描第一个数字,将摇滚ID转换为id,您将指定第一个地点的摇滚ID,
场地[0] .rockid = id;
对于数组,您必须进行字符串复制。你已经为它们分配了内存,所以你只需要使用strcpy。
但你不能只是将字符串复制到结构中,并将它们全部放在正确的位置。您需要获得每个部分并单独添加
这意味着您需要单独读取每个元素,例如“%d%s”来读取int然后读取字符串,或者其他什么,或者您需要在读完整个内容后拆分字符串。 注意强> %s不会读全行!它将停在第一个空格字符(新行,制表符,甚至空格),所以如果你在“喜欢那里”,你会得到“喜欢”。你可能想要使用%[^ \ n],而字符不匹配\ n。
我的建议是将fscanf与多个项目一起使用,但是如果需要拆分字符串,则需要使用sscanf,它允许您再次扫描字符串。
最后,你不需要测试feof,这实际上是有问题的。使用while(fscanf(参数在这里)> 0)要好得多,因为EOF通常为-1,0表示没有扫描任何项目。无论哪种方式,你都读完了。
我建议你从小做起。看起来你在没有理解基础知识的情况下试图跳过去,而且C对于需要了解它们有点残酷。
祝你好运。P.S。我现在很可能在这里犯了一个小错误,写这个,因为我不是C专家,但我相信有人会来帮助我。发现错误是我们学习的方式,所以不要气馁。 :)