2017-07-26 16 views
0

私は現在、競馬ゲームになるC言語のプログラムを作成しています。私が立ち往生している部分は、ファイルからランダムな名前を生成しています。私は馬のための構造とリンクされたリストを使用して10頭の馬を保管しています。名前はファイル "Names"にあります。私は、ファイル内のランダムな線を選び、それに行き、リンクされたリストの現在のノードに名前をコピーし、次の馬に移動したい。現在のところ、起動時に応答が停止し、-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

'j ++;' - > 'cnt ++'、 'tmp = malloc(sizeof(node)); tmp = head; ':' tmp'は 'head'で上書きします。 – BLUEPIXY

+2

ファイルに3162行があることをご存知ですか?どうしてわかるの?ファイルが編集された場合はどうなりますか?ファイル内にそれほど多くの行がない場合、コードは何をすべきですか? –

+0

はおそらく 'j'をオーバーフローしてビジー状態になり、fgetsでファイルの最後を読み取ってしまうため、応答が停止します。 fgetsはNULLを返します... –

答えて

0

structキーワードは、構造の名前とともに使用してください。 つまり、nodeの代わりにstruct nodeを使用してください。

rand()と一緒に使用することをお勧めします。それ以外の場合は、プログラムを実行するたびにrand()はおそらく同じ値を返します。あなたはbuffに読み込まするfgets()を使用した後strcpy(tmp->name, buff);を行うと

は、fgets()は、文字列の最後に改行 (\n)を維持することを覚えておいてください。それを削除したいかもしれません。

あなたはNames.txtという名前のファイルを開こうとしている場合は、fopen("Names.txt","r");代わりのfopen("Names","r");

BLUEPIXY

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

にあなたが最初tmpにメモリを割り当て、そのメモリを孤立していることを指摘を書く必要がありますをheadで上書きします。 新しいノードを格納するために別の変数を使用します。

nameの値をheadに割り当てたいと思うと思います。そうであれば、新しいノードを作成する必要はありません。

Felix Guoが指摘されているので、作業を終えたらファイルストリームを閉じるにはfclose()を使用してください。

EDIT:もちろん 、あなたはcnt++whileループでj++を変更する必要がありますが、あなたはすでにそれに気づきました。

関連する問題