2011-01-30 9 views
-1

私は電子メールアドレスを持つテキストファイルを持っています。ファイルからデータを取得するためのリンクリストの使用

私はそれらの電子メールを入手し、それを任意のデータ構造または変数に格納したいと考えています。 次に、データ構造からランダムにメールアドレスを選択する必要があります。

#include<stdio.h> 
#include<conio.h> 
#include <stdlib.h> 
#include<string> 

struct link_list 
{ 
    char mail[50]; 
    int counter; 
    struct link_list *next; 
}; 
typedef struct link_list node; 


void main() 
{ 
FILE *fp ; 
char string1[80]; 
node *head; 
int count_length=0; 
char *fname = "email.txt"; 
fp = fopen (fname, "r") ; 
char line [ 128 ]; /* or other suitable maximum line size */ 
int count=0; 

while (fgets (line, sizeof line, fp) != NULL) /* read a line */ 
{ 
    count++; 
    if(head==NULL) 
    { 
     head=(node *)malloc(sizeof(node)); 
     fscanf(fp,"%s",string1); 
     strcpy(head->mail,string1); 
     head->counter=count; 
     head->next=NULL; 

    } 
    else 
    { 
    node *tmp = (node *)malloc(sizeof (node)); 
    fscanf(fp,"%s",string1); 
    strcpy(tmp->mail,string1); 
    tmp->next = head; 
    tmp->counter=count; 
    head = tmp; 

    } 

} 

fclose(fp); 
fp = fopen (fname, "r") ; 

fclose(fp); 
//printf("%d",count_length); 
getch(); 
} 

私はcode..iは、アサーションエラーに代わり尾のリストの先頭に新しいエントリを追加

+0

さらに進む前に、 'fopen'の呼び出しが成功し、エラーを適切に処理する必要があります。 –

+1

あなたのコードを少し分けることをお勧めします:最初に動作するリンク先の実装を記述し、_then_あなたのファイルの内容で埋めようと心配します。 'head'がNULLでない場合、新しい' node'を割り当て、必要なデータを格納し、 'next'ポインタを' head'に設定し、 'head'を新しいものに置き換えますノード。代わりに追加したい場合は、それはより多くの作業であり、ユーザーの練習として残します。 :) – sarnold

答えて

2

てみてくださいを取得しています編集しました。例:

node *tmp = malloc(sizeof *tmp); 
fscanf(fp, "%s", tmp->mail); 
tmp->next = head; 
head = tmp; 
+0

Thnx ...ファイルから2つのランダムな値を直接選ぶことができるので、このリンクされたリストのアイデアを出してfseek()とftell()を使うことができますか? –

0

最初のパスで各データの開始オフセットを検索すると、fseekを使用できます。

または、乱数テストの確率分布を逆転させる場合は、除算の代わりにmodを使用して、プログラミングの実践からトリックを使用することができます。これにより、1回のパスで未知の長さのリストからランダムな要素を選択することができます。

このプログラムでは、文字列のランダムな文字を1回のパスで選択して印刷するテクニックを使用します。

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main(void) { 
    char *s = "asequenceofasciivalues"; 
    int i; 
    char o; 
    srand(time(NULL)); 
    o = s[0]; 
    for (i=0; s[i]; i++) 
     if (rand() % (i+1) == 0) 
      o = s[i]; 
    printf("%c\n", o); 
    return 0; 
} 
関連する問題