以下のコードを作成しました。私がする必要があるのは、ユーザーから取得して入力する必要がある(ユーザー名とパスワード)ので、入力したファイルを確認する必要があります。この問題は、一度に.txtファイル全体をコピーしないようにします。Cでの認証(指定されたファイルからの読み取りとチェック)
root
jfl34jgf
ben
12b43
stella
ldfo421
kate
jfd45g
bill
iu3556
guest
1234
test
1234
だから私は、すべてのユーザー名を取得することを考えて、リストにそれらを入れた後、入力してそれらの一つ一つをチェックしていた:.txtファイルは、次のように変換されます。ユーザ名、ユーザ名が終わる位置(ftell()
を使用)、次の要素を指す次のポインタを含む構造体を作成しました。ご覧のように、テキストはユーザー名とパスワードのようにフォーマットされています。パスワードはユーザ名の直後に来ます。名前の比較が真実であれば、各ユーザー名にftell()を使用してパスワードチェックを確認できます。
これまでのコードです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct names
{
char name[20];
int pos;
struct names *next;
};
typedef struct names Names;
void create_list(Names *l, char *temp1, int pos)
{
Names *temp;
temp=(Names*)malloc(1*sizeof(Names));
temp->next=NULL;
strcpy(temp->name, temp1);
temp->pos=pos;
temp->next=l;
printf("%s ", temp->name);
l=temp;
printf("%s\n", l->name);
}
void create_list_from_File(FILE *fp, Names *l)
{
char ch;
int i=0, check=0, pos;
char temp1[20];
temp1[0]='\0';
while(1)
{
if(check==1)
break;
while((ch=fgetc(fp))!='\n')
{
temp1[i]=ch;
i++;
}
temp1[i]='\0';
pos=ftell(fp)+1;
create_list(l,temp1, pos);
while((ch=fgetc(fp))!='\n')
{
if(ch==EOF)
{
printf("EOF ");
check=1;
break;
}
}
i=0;
}
}
void display(Names *l)
{
Names *cursor;
cursor=l;
while (cursor!=NULL)
{
printf("%s\n", cursor->name);
cursor=cursor->next;
}
}
int main()
{
char usern[20][20];
char passw[20];
FILE *fp;
Names l;
l.next=NULL;
char c;
int i=0;
fp=fopen("users.txt", "r");
if(fp==NULL)
{
printf("File not opened!\n");
exit(1);
}
create_list_from_File(fp, &l);
display(&l);
/* fgets(usern, 20, stdin);
usern[strlen(usern)-1]='\0';
while(strcmp(usern, "exit")!=0)
{
fgets(passw,20, stdin);
passw[strlen(passw)-1]='\0';
check(fp, usern, passw);
}
*/
return 0;
}
現在、私はリンクされたリストの中に何も見ません。ファイルから文字列を正しく取得しています(ユーザー名が表示されます)が、リストを印刷しようとするとちょっと変わった値が返されます。ヘルプは非常に高く評価されます。