部分洗掉空缺功能:輸入聯系人姓名查找相應資料然后洗掉資料(聯系人已保存至檔案)還未學習鏈表,不能使用鏈表洗掉
uj5u.com熱心網友回復:
建議樓主貼全代碼吧uj5u.com熱心網友回復:
#include<stdio.h>//密碼,新建,瀏覽,洗掉原有資料,洗掉一條資料,查找,添加
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define M 20
struct conect//結構體
{
char name[11];
char telnum[12];//電話號碼
char address[100];//地址
int f;//標簽
};
int N=0;//總人數的全域變數
int n;
int num;//總人數
struct conect c[10];//結構體數量
struct conect cc;
int main(void)
{
void input(),expl(),meun(), password(), save(),read(),serch(), dele(),dele_all();
void dele_menu(),newsave();
void dele_save();//部分洗掉函式
int choice;
//password();
system("pause");
system("cls");
while (1)
{
meun();
printf("\t\t\t\t\t\t");
scanf("%d", &choice);
switch (choice)
{
case 1:input();break;
case 2:expl();break;
case 3:save();break;
case 4:read();break;
case 5:serch();break;
case 6:dele_menu();break;
case 7:newsave();break;
case 0:exit(0);
}
printf("\n");
system("pause");//暫停函式
system("cls");//清屏函式
}
}
void input()//輸入資料函式
{
int i;
printf("\t\t\t\t\t\t輸入人數:");
scanf("%d", &num);
n = N;
for (i = N;i < num+n;i++,N++)
{
printf("\t\t\t\t\t\t姓名:");
scanf("%s", c[i].name);
printf("\t\t\t\t\t\t電話:");
scanf("%s", c[i].telnum);
printf("\t\t\t\t\t\t地址:");
rewind(stdin);
gets(c[i].address);
printf("\t\t\t\t\t\t標簽:");
scanf("%d", &c[i].f);
printf("\n");
N++;
}
}
void expl()//瀏覽輸入為保存資訊(時效性)
{
int i;
printf("%12s%12s%30s%10s\n", "姓名", "電話", "地址", "標簽");
for (i = 0;i < num+N ;i++)
{
printf("%12s%12s%30s", c[i].name, c[i].telnum, c[i].address);
switch (c[i].f)
{
case 1:printf(" 親戚\n");break;
case 2:printf(" 同事\n");break;
case 3:printf(" 朋友\n");break;
}
}
}
void meun()
{
printf("\t\t\t\t\t\t1.錄入聯系人\n");
printf("\t\t\t\t\t\t2.瀏覽通訊錄\n");
printf("\t\t\t\t\t\t3.保存聯系人\n");
printf("\t\t\t\t\t\t4.讀取檔案\n");
printf("\t\t\t\t\t\t5.查找聯系人\n");
printf("\t\t\t\t\t\t6.洗掉聯系人\n");
printf("\t\t\t\t\t\t7.新建檔案\n");
printf("\t\t\t\t\t\t0.退出\n");
printf("\t\t\t\t\t\t請輸入1-2\n");
}
void dele_menu()
{
int a;
printf("\t\t\t\t\t\t1.洗掉未保存聯系人\n");
printf("\t\t\t\t\t\t2.洗掉已保存聯系人\n");
printf("\t\t\t\t\t\t3.洗掉全部聯系人\n");
scanf("%d",&a);
switch (a)
{
case 1:dele();break;
case 2:dele_save();break;
case 3:dele_all();break;
default:
break;
}
}
void password()
{
char password[10] = "123456";//正確密碼
char ps[10];//定義一個新陣列用與正確答案做對比
int i,j;
printf("\n\n");
printf("\t\t\t\t\t\t================================\n");
printf("\t\t\t\t\t\t 用戶登錄系統\n");
printf("\t\t\t\t\t\t================================\n");
printf("\n\n");
for (j = 0;j < 4;j++)
{
i = 0;
printf("\t\t\t\t\t\t請輸入密碼.\n");
printf("\t\t\t\t\t\t密碼:");
while ((ps[i] = getch()) != 13)//用于替換*號,且回車結束輸入判斷
{
if (ps[i] == '\b')//(\b)退格符,在此用于發揮洗掉功能
{
printf("\b \b");//起洗掉功能
i--;//向后減少一位將游標提前
}
else
{
printf("*");
i++;
}
}
ps[i] = '\0';
printf("\n");
if (strcmp(password, ps) == 0)
{
printf("\n\n");
printf("\t\t\t\t\t\t================================\n");
printf("\t\t\t\t\t\t 歡迎用戶! \n");
printf("\t\t\t\t\t\t================================\n");
printf("\n\n");
break;
}
else
{
printf("\t\t\t\t\t\tNO!\n");
if (3 - j == 0)
{
printf("\t\t\t\t\t\t全部錯誤自動退出!");
exit(0);
}
printf("\t\t\t\t\t\t還有%d次機會!\n", 3 - j);
}
}
}
void save()//內容儲存函式
{
FILE* fp;
int* a;
int i;
fp = fopen("conect.dat","wb");//建立一個檔案并且打開寫入類容
for (i = 0;i < N;i++)
{
fwrite(&c[i],sizeof(struct conect),1,fp);//寫入檔案塊
}
fclose(fp);//關閉檔案
printf("保存成功\n");
}
void read()//類容讀取函式
{
FILE *fp;//指標變數的定義
int i;
fp = fopen("conect.dat", "ab+");//建立一個檔案并且打開寫入類容
printf("%12s%12s%30s%10s\n", "姓名", "電話", "地址", "標簽");
while(1)
{
fread(&cc, sizeof(struct conect), 1, fp);//讀取檔案塊
if (feof(fp))//file end of 結束標志
{
break;
}
printf("%12s%12s%30s", cc.name, cc.telnum, cc.address);
switch (cc.f)
{
case 1:printf(" 親戚\n");break;
case 2:printf(" 同事\n");break;
case 3:printf(" 朋友\n");break;
}
}
fclose(fp);//關閉檔案
}
void serch()//查詢函式
{
int i;
int flag = 0;
char t_name[M];
FILE* fp;
fp = fopen("conect.dat", "ab+");//打開原檔案
printf("\n\t\t\t\t\t\t--------------------------------------\n");
printf("\t\t\t\t\t\t輸入你要查詢的姓名=");
scanf("%s", t_name);
printf("\n");
printf("\n");
printf("\n");
printf("%12s%12s%30s%10s\n", "姓名", "電話", "地址", "標簽");
while (1)
{
fread(&cc, sizeof(struct conect), 1, fp);//讀取檔案塊
if (feof(fp))//file end of 結束標志
{
break;
}
printf("%12s%12s%30s", cc.name, cc.telnum, cc.address);
switch (cc.f)
{
case 1:printf(" 親戚\n");break;
case 2:printf(" 同事\n");break;
case 3:printf(" 朋友\n");break;
}
}
fclose(fp);//關閉檔案
}
void dele()//洗掉未保存時效資料函式
{
int m, j,i;
int h = 0;
int flag = 0;
char t_name[M];
printf("\t\t\t\t\t\t輸入姓名=");
scanf("%s", t_name);
printf("\n");
printf("\n");
for (i = 0;i < num;i++)
{
if (strcmp(t_name, c[i].name) == 0)
{
printf("\t\t\t\t\t\t-----------------------------------\n");
printf("\t\t\t\t\t 查找成功,是否洗掉?\n\n");
printf("\t\t\t\t\t\t1.洗掉 ");
printf("2.退出\n");
printf("\t\t\t\t\t\t-----------------------------------\n");
flag = 1;
break;
}
h++;
}
if (flag == 0)
{
printf("\t\t\t\t\t\t無可查找物件");
return;
}
printf("\t\t\t\t\t\t請輸入:");
scanf("%d", &m);
if (m == 1)
{
for (j = h;j < num;j++)
{
c[i] = c[i + 1];
}
printf("\n");
printf("\t\t\t\t\t\t洗掉成功!!\n");
num--;
}
}
void dele_save()//部分洗掉函式功能:輸入聯系人姓名查找相應資料然后洗掉資料(聯系人已保存至檔案)
{
}
void dele_all()
{
FILE* fp;
int ret, a;
char filename[] = "conect.dat";//將檔案名賦值給一個字串
fp = fopen("filename", "rb+");//打開檔案以二進制檔案讀取的方式
ret = remove(filename);//將洗掉函式賦值給一個整形,方便if陳述句判斷回傳值
if (ret == 0)//當回傳值為-1時報錯,當回傳值為時執行洗掉
{
printf("檔案洗掉成功");
}
else
{
printf("錯誤:不能洗掉該檔案");//一般來說可以用perror("remove");列印錯誤原因,但結果為英文
}
}
void newsave()
{
int i;
char filename[100];//定義一個字符陣列儲存檔案名
FILE* fp;
printf("請輸入你要自定義的檔案夾");
scanf("%s", filename);//輸入一個檔案名
fp = fopen(filename, "ab");//創建一個新的二進制檔案
for (i = 0;i <= N;i++)
{
fwrite(&c[i], sizeof(struct conect), 1, fp);//可以用回圈寫入檔案
}
fclose(fp);//關閉檔案
printf("保存成功!\n");
}
uj5u.com熱心網友回復:
不能用鏈表那就是陣列了,陣列洗掉是找到要洗掉的元素的下標,然后把它之后的元素逐一前移一個位置,再保存到檔案中即可。uj5u.com熱心網友回復:
謝謝你 我解決了 因為要用檔案所以不能用陣列,我現在用的是把要洗掉和不洗掉的分別放到兩個空檔案里面,然后用remove洗掉其中要洗掉資料的那個檔案,用rename重命名另一個檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/231237.html
標籤:C語言
上一篇:求一份學習計劃管理軟體的設計思路
下一篇:求助。。
