试图将文本文件数据读入结构数组?

时间:2013-10-16 01:08:38

标签: c arrays file struct text-files

这是我想要做的:

  • 将我的2个文本文件读入“结构数组”(这就是我的任务的措辞)。
  • 为从文件中读取的每个条目动态创建足够的内存

这是我正在使用的结构之一:

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

2 个答案:

答案 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专家,但我相信有人会来帮助我。发现错误是我们学习的方式,所以不要气馁。 :)