我目前正在用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;
}
答案 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
,但您已经注意到了。