先週と来週は C 言語のコース設計に取り組んでおり、新しい知識の更新が少し遅れていますが、このブログでは C 言語ファイルの操作とコードを書くときに発生する問題について理解していきます。
まず、ユーザーログインシステムと管理者ログインシステムを設定します。ユーザーがログインすると、システムはユーザーが入力した服のサイズと衣服システムの残りのサイズを比較して、サイズに合った服を推奨します。
このコードが実現できたのは、私が不器用でファイル読み込みに fwrite と fread を長く使ってきたからかもしれません。したがって、衣服のテキスト内の情報が正しい位置で読み込まれていないため、読み込むときに構造体の最初の文字配列にすべての情報が読み込まれるのはなぜかと考えていたところ、コースで発見しました。設計 read 関数が情報を 1 つずつ読み取る場合、情報を 1 つずつ保存して読み取る方法がないため、コード内の fwrite と fread をすべてそれぞれ fprintf と fscanf に変更しました。そしてコンパイルすると、ユーザーがログインした後は通常通りに服装情報がレコメンドされることが分かりました。これは私の独自の考え方で、出力してみると服の種類は1種類しか推奨できないことが分かりましたが、最後にfeofで判定することもあったのでループを使用しました。常にループから抜け出すことができないことがわかり、if で等価性を判断した後にループから抜け出す方法がわからなかったので、友人の提案を聞いてカウンターを使用して全体を数えました最初にループし、次のループが衣類の総数に達した後に終了します。ただし、読み込み後にファイルのポインタがファイルの末尾を指しているという別の問題があるため、fseek() 関数を使用して、衣服テキスト内のファイルの先頭を再度ポインタが指すようにして、再度読み込みます。 。実はこの関数もリンクリストを使うこともできると思うのですが、コードや関数がちょっと多すぎて、リンクリストを使うとごちゃごちゃしてバグを見つけるのが大変なのでカウンターを選択しました。方法。授業が終わったら、リンクリストを使ってその機能を分析してみます。
このモジュールのコードは次のようになります。
void userin()
{
Users y={0};
stu f={0};
int count=0;
FILE *pe=fopen("users.txt","r+");
FILE *pi=fopen("fuzhuang.txt","r+");
fscanf(pe,"%s %s %s %s %s",y.id,y.name,y.paw,y.sex,y.size);
fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
printf("\t跟您尺码相同的服装库存还有:\n");
printf("\t服装品牌\t服装编号\t服装类型\t服装尺寸\t服装售价\t服装库存\n");
while(1)
{
if(feof(pi)==0)
{
fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
count++;
}
else
break;
}
fseek(pi,0L,SEEK_SET);
while(count--)
{
if(strcmp(y.size,f.size)!=0)
{
if(feof(pi)==0)
{
fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
}
}
else
{
printf("\t%s\t\t%s\t\t%s\t\t%s\t\t%d\t\t%d\n",f.brand,f.num,f.name,f.size,f.price,f.stock);
if(feof(pi)==0)
{
fscanf(pi,"%s %s %s %s %d %d",&f.brand,&f.name,&f.num,&f.size,&f.price,&f.stock);
}
}
}
}
もちろんこの機能以外にも、ユーザー登録時やログイン時に保存・読み込みが必要なデータなど、もう少し実装が難しい機能もあると思います。そして、それらが等しいかどうかを比較する必要がありますが、2 つの機能の実現は悪くないので、登録コードとログインコードを直接見てみましょう!
void Regist()
{
administrator a={0},b={0};
char tmp[20]={-1}; //判断密码是否相同时使用的
FILE *pf = NULL;
pf = fopen("administrator.txt","r"); //用pf去指向文件,文件是要已经存在的文件 只读模式
if(pf == NULL)
{
printf("注册时打开文件失败\n");
return ;
}
printf("\t\t\t欢迎来到注册界面\n\n");
printf("\t\t\t输入账号->");
scanf("%s",a.id);
printf("输入成功!\n");
//【注册界面】
printf("\t\t\t请输入姓名->");
scanf("%s",a.name);
printf("\t\t\t请输入性别:男/女->");
do
{ //输入性别并查看是否输入正确
getchar();
scanf("%s",a.sex);
}while(1);
printf("\t\t\t请输入密码->");
scanf("%s",a.paw);
printf("\t\t\t请再输入一次密码->");
do //判断两次密码是否相等
{
scanf("%s",tmp);
if(strcmp(tmp,a.paw) != 0)
printf("\t\t\t两次输入密码不一致,请再输入一次密码->");
else
break;
}while(1);
//两次密码一致
fclose(pf);
pf = NULL;
pf = fopen("administrator.txt","a"); //以追加的形式写入文件
//fwrite会在当前文件指针的位置写入数据
//"w" 打开,文件指针指到头,只写;"a" 打开,指向文件尾部,不覆盖。
fprintf(pf,"%s %s %s %s",a.name,a.paw,a.id,a.sex); //将a的数据存入文件之中
printf("\t\t\t注册成功!\n");
fclose(pf);
pf = NULL;
system("cls");
return;
}
bool Login() //返回值是一个布尔变量
{
administrator a={0},b={0};
FILE *pf = fopen("administrator.txt","r+"); //以读的模式打开文件
if(pf == NULL)
{
printf("文件打开失败\n");
return false;
}
printf("欢迎来到登录界面!\n");
printf("请输入账号->");
scanf("%s",a.id);
fscanf(pf,"%s %s %s %s",b.name,b.paw,b.id,b.sex); //每次读取Users个长度,读一次。
while(1)
{
if(strcmp(a.id, b.id) != 0 )
{
if(feof(pf) == 0)//未到文件尾 一直向后查找
{
fscanf(pf,"%s %s %s %s",b.name,b.paw,b.id,b.sex);
}
else
{
printf("该账号不存在,请先注册\n");
fclose(pf);
pf = NULL;
return false;
}
}
else//账号注册过->跳到输入密码
{
break; //退出无限循环,跳到输入密码
}
}
//【输入密码】
printf("请输入密码->");
do
{
scanf("%s",a.paw);
}while(1);
printf("登录成功!\n");
fclose(pf);
pf = NULL;
system("cls");
return true;
}
誰もがコードを直接コピーして貼り付けることができないように、上記のコードをいくつか削除しました。コース設計の関連機能が必要な友人がいる場合は、csdn でプライベート メッセージを送っていただければ、必ずお答えします。質問。
その他のコードについては、関連する機能の実装が非常に簡単だと個人的に思っているので、ここでは詳しく紹介しません。私のプログラムのスクリーンショットを撮りますので、見てください。何か機能が必要な場合は、私にプライベート メッセージを送ってください。
私のユーザーログイン端末には、将来的に多くの機能が追加される可能性があります。
次の図は、ユーザーが希望する価格に対するユーザーへの推奨値です。
システムからログアウトするための関連操作は次のとおりです。
私のブログの説明はここで終わります。ここでいくつかの機能のコードが必要な場合は、プライベート メッセージを送ってください。あるいは、私のブログに不明瞭な表現や問題がある場合は、ようこそ。ご指摘いただきありがとうございます。