将随机名称从文件分配给结构名称

时间:2017-07-26 00:25:47

标签: c

我目前正在用C编写一个程序,最终将成为赛马游戏。我坚持的部分是从文件中生成随机名称。我正在使用马的结构和链接列表来存储10匹马。名称位于文件“名称”中。我想在文件中选择一个随机行,转到它,将名称复制到链表中的当前节点,然后转到下一匹马。目前它只是在我启动时停止响应并返回-1073741819(0xC0000005)

我对使用C与文件进行交互不是很有经验,所以非常感谢任何帮助。

struct node{
    int data;
    float mult;
    float payout;
    int score;
    struct node *next;
    char name[20];//Where I'm trying to store the random name.
};


void rand_name(node* head, int i){
    //A function to generate a random name from a list of 3162 names.

    FILE* infile;
    infile = fopen("Names","r");

    if(infile == NULL){
        printf("Error opening Names.txt");
        exit(EXIT_FAILURE);
    }
    int cnt, j = rand() % 3162;//Pick a random line to copy.
    char buff[100];

    node *tmp = NULL;
    tmp = malloc(sizeof(node));
    tmp = head;

    for(cnt = 0; cnt < 1; cnt++){
        tmp = tmp->next; //Get to the current node.
    }
    cnt = 0;
    while(cnt < j){
        //Copy each line until you get to the random line to copy.
        fgets(buff, 100, infile);
        j++;
    }

    strcpy(tmp->name, buff); //Store the last copied line into the node.

    return;
}

1 个答案:

答案 0 :(得分:0)

使用struct关键字以及结构名称。 即,在您的计划中使用struct node而不只是node

考虑使用srand()rand(),否则每次运行程序时,rand()都可能返回相同的值。

在使用strcpy(tmp->name, buff);阅读fgets()buff时,请记住fgets()将保留换行符 (\n)在字符串的末尾。您可能想删除它。

如果您尝试打开名为Names.txt的文件,则应编写fopen("Names.txt","r");而不是fopen("Names","r");

BLUEPIXY指出

tmp = malloc(sizeof(struct node));
tmp = head;

您首先将内存分配给tmp,然后通过使用tmp覆盖head来孤立该内存。 使用另一个变量来存储新节点。

我认为您只想为name的{​​{1}}分配一个值。如果是这样,则无需创建新节点。

正如Felix Guo指出的那样,使用head关闭文件流。

编辑: 当然,您需要将fclose()循环中的j++更改为while,但您已经注意到了。