0

这是我想做的事情:

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

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

typedef struct {
    int eventid;
    char eventdate[20];
    char venuename[20];
    char country[20];               
    int rockid;
} Venue;

在我的主要功能中,我有数组设置来接收文本:

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
4

2 回答 2

0

您正在尝试将字符串复制到场地结构中,您希望它如何工作?strcpy(场地[i],缓冲区);

请举例说明您的文件,您可能需要解析每个元素并将其写入结构成员

于 2013-10-16T01:49:23.090 回答
0

你可以跳过但最终应该做的事情:

使用函数(void),而不仅仅是函数的空()。您正在使用的visual studio允许它,但它的格式不好。

声明全局变量同样是不好的形式。您想在 main 中声明它们并传递它们。

最后,你想回来。从 main 成功运行返回 0。如果你有一个 void 函数,仍然,返回;在函数的最后一个结束 '}' 字符之前。

哦,fscan_s 不可移植,它是 Microsoft 的功能。

您实际询问的内容:

现在,到你的问题上。不要分配内存并分配它。通过使它们成为具有给定字符数的数组,您已经为结构和字符串静态分配了内存。如果要静态分配内存,则需要使用指针。

如果您扫描第一个数字,将摇滚 id 扫描到 id,您会将第一个场地的摇滚 id 分配为,

场地[0].rockid = id;

对于数组,您必须进行字符串复制。你已经为它们分配了内存,所以你只需要使用 strcpy。

但是您不能只是将字符串复制到结构中,然后将它们全部放在正确的位置。您需要获取每个部分并单独添加

这意味着您要么需要分别读取每个元素,例如 "%d%s" 来读取一个 int 然后是一个字符串,或者其他什么,或者您需要在读取整个内容后拆分您的字符串。 注意 %s 不会读取整行!!!它会在第一个空白字符处停止(换行符、制表符,甚至是空格),所以如果你 %s "hi there" 你会得到 "hi"。您可能想使用 %[^\n] 而字符不匹配 \n。

我的建议是将 fscanf 与多个项目一起使用,但如果您需要拆分字符串,则需要使用 sscanf,它可以让您再次扫描字符串。

最后,您不需要测试 feof,这实际上是有问题的。使用 while (fscanf(parameters go in here) > 0) 要好得多,因为 EOF 通常为 -1,0 表示未扫描任何项目。不管怎样,你已经读完了。

我建议你从小处着手。看起来您正在尝试在不了解基础知识的情况下继续前进,而 C 语言对于需要了解这些知识有点残酷。

祝你好运。

PS很可能我刚才在这里犯了一个小错误,写这个,因为我不是C专家,但我相信有人会过来帮助我。发现错误是我们学习的方式,所以不要气馁。:)

于 2013-10-16T02:12:07.380 回答