1 /*文件存储和读取那里不知道哪错了,一直没成功QAQ*/ 2 3 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<conio.h> 8 #define LEN sizeof(struct Addrbook) 9 10 struct Addrbook{ 11 int num; 12 char name[20]; 13 char ID[20]; 14 char cla[20]; 15 char major[20]; 16 char tel[20]; 17 char age[10]; 18 char birth[10]; 19 char email[30]; 20 char dom[30]; 21 char home[30]; 22 }addr[100]; 23 24 int num=0; 25 26 void add(); 27 void show(); 28 void modify(); 29 void del(); 30 void menu(); 31 void save(); 32 void read(); 33 34 int main() 35 { 36 read(); 37 show(); 38 menu(); 39 return 0; 40 } 41 42 43 void menu() 44 { 45 system("cls"); 46 printf("\n\t\t***********************MENU************************"); 47 printf("\n\t\t 1--Add 2--Show "); 48 printf("\n\t\t 3--Modify 4--Delete "); 49 printf("\n\t\t 5--Save 6--Exit "); 50 char n; 51 printf("\n\t\tEnter the number:"); 52 scanf("%s",&n); 53 fflush(stdin); 54 switch(n) 55 { 56 case '1':add();break; 57 case '2':show();break; 58 case '3':modify();break; 59 case '4':del();break; 60 case '5':save();break; 61 case '6':exit(0); 62 default:printf("Error!");break; 63 } 64 } 65 66 67 void add() 68 { 69 printf("\n\t\t********Please enter the information*******"); 70 printf("\n\t\tNo.%d",num+1); 71 printf("\n\t\tName: "); 72 scanf("%s",&addr[num].name); 73 printf("\t\tID: "); 74 scanf("%s",&addr[num].ID); 75 printf("\t\tClass "); 76 scanf("%s",&addr[num].cla); 77 printf("\t\tMajor:"); 78 scanf("%s",&addr[num].major); 79 printf("\t\tTel: "); 80 scanf("%s",&addr[num].tel); 81 printf("\t\tAge: "); 82 scanf("%s",&addr[num].age); 83 printf("\t\tBirth:"); 84 scanf("%s",&addr[num].birth); 85 printf("\t\tEmail:"); 86 scanf("%s",&addr[num].email); 87 printf("\t\tDom: "); 88 scanf("%s",&addr[num].dom); 89 printf("\t\tHome: "); 90 scanf("%s",&addr[num].home); 91 num++; 92 93 printf("\n\t\tEnd adding?(Y/N):"); 94 if(getch()=='n'||getch()=='N') 95 add(); 96 else 97 menu(); 98 99 } 100 101 void show() 102 { 103 int i; 104 if(num!=0) 105 { 106 printf("\n\t\t*********All the information below**********"); 107 for(i=0;i<num;i++) 108 { 109 printf("\n\t\tNo. %d",i+1); 110 printf("\n\t\tName: %s",addr[i].name); 111 printf("\n\t\tID: %s",addr[i].ID); 112 printf("\n\t\tClass:%s",addr[i].cla); 113 printf("\n\t\tMajor:%s",addr[i].major); 114 printf("\n\t\tTel: %s",addr[i].tel); 115 printf("\n\t\tAge: %s",addr[i].age); 116 printf("\n\t\tBirth:%s",addr[i].birth); 117 printf("\n\t\tEmail:%s",addr[i].email); 118 printf("\n\t\tDom: %s",addr[i].dom); 119 printf("\n\t\tHome: %s\n\n",addr[i].home); 120 } 121 system("pause"); 122 } 123 else 124 { 125 printf("\n\t\tThere is no record!\n"); 126 system("pause"); 127 } 128 menu(); 129 } 130 131 void modify() 132 { 133 134 } 135 136 void del() 137 { 138 char s[20]; 139 int i=0,j; 140 if(num==0) 141 { 142 printf("\n\t\tThere is no records!"); 143 getch(); 144 menu(); 145 } 146 printf("\n\t\tPlease enter the name you want to delete:"); 147 scanf("%s",s); 148 for(j=0;j<=num-1;j++) 149 { 150 if(strcmp(addr[j].name,s)!=0) 151 { 152 if(j==num) 153 { 154 printf("\n\t\tError!didn't find the records."); 155 continue; 156 } 157 } 158 159 else 160 { 161 strcpy(addr[j].name,addr[j+1].name); 162 strcpy(addr[j].ID,addr[j+1].ID); 163 strcpy(addr[j].cla,addr[j+1].cla); 164 strcpy(addr[j].major,addr[j+1].major); 165 strcpy(addr[j].tel,addr[j+1].tel); 166 strcpy(addr[j].age,addr[j+1].age); 167 strcpy(addr[j].birth,addr[j+1].birth); 168 strcpy(addr[j].email,addr[j+1].email); 169 strcpy(addr[j].dom,addr[j+1].dom); 170 strcpy(addr[j].home,addr[j+1].home); 171 num--; 172 printf("\n\t\tDelete successfully!"); 173 } 174 } 175 printf("\n\t\tEnd deleting?(Y/N):"); 176 if(getch()=='n'||getch()=='N') 177 del(); 178 else 179 menu(); 180 181 182 } 183 184 185 <strong>void save()</strong> 186 { 187 FILE *fp; 188 int i; 189 if((fp=fopen("addressbook.dat","wb"))==NULL) 190 { 191 printf("\n\t\tOpen fail!"); 192 exit(0); 193 } 194 else 195 printf("success!"); 196 for(i=0;i<=num;i++) 197 { 198 if((fwrite(&addr[i],sizeof(struct Addrbook),1,fp))!=1) 199 { 200 printf("%s",addr[i].name); 201 } 202 } 203 fclose(fp); 204 printf("\n\t\tPress any keys to get back to the menu."); 205 getch(); 206 menu(); 207 } 208 209 210 <strong>void read()</strong> 211 { 212 FILE *fp; 213 int i; 214 if((fp=fopen("addressbook.dat","rb"))==NULL) 215 { 216 printf("\n\t\tOpen fail!"); 217 system("pause"); 218 getch(); 219 menu(); 220 } 221 else 222 printf("success!"); 223 system("pause"); 224 for(i=0;i<num;i++) 225 { 226 if(fread(&addr[i],LEN,1,fp)!=1) 227 printf("\n\t\tSomething wrong!\n"); 228 } 229 fclose(fp); 230 }
你可以调试一下,在第几行出错了。我粘贴代码都把行号粘贴出来了,不好调试。你把源代码干净的贴出来。不要行号。
大概就是fwrite那里应该是有问题,但是在别的程序里写的时候行得通,,,这里QAQ麻烦你看一下,,,
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #define LEN sizeof(struct Addrbook) struct Addrbook{ int num; char name[20]; char ID[20]; char cla[20]; char major[20]; char tel[20]; char age[10]; char birth[10]; char email[30]; char dom[30]; char home[30]; }addr[100]; int num=0; void add(); void show(); void modify(); void del(); void menu(); void save(); void read(); int main() { read(); show(); menu(); return 0; } void menu() { system("cls"); printf("\n\t\t***********************MENU************************"); printf("\n\t\t 1--Add 2--Show "); printf("\n\t\t 3--Modify 4--Delete "); printf("\n\t\t 5--Save 6--Exit "); char n; printf("\n\t\tEnter the number:"); scanf("%s",&n); fflush(stdin); switch(n) { case '1':add();break; case '2':show();break; case '3':modify();break; case '4':del();break; case '5':save();break; case '6':exit(0); default:printf("Error!");break; } } void add() { printf("\n\t\t********Please enter the information*******"); printf("\n\t\tNo.%d",num+1); printf("\n\t\tName: "); scanf("%s",&addr[num].name); printf("\t\tID: "); scanf("%s",&addr[num].ID); printf("\t\tClass "); scanf("%s",&addr[num].cla); printf("\t\tMajor:"); scanf("%s",&addr[num].major); printf("\t\tTel: "); scanf("%s",&addr[num].tel); printf("\t\tAge: "); scanf("%s",&addr[num].age); printf("\t\tBirth:"); scanf("%s",&addr[num].birth); printf("\t\tEmail:"); scanf("%s",&addr[num].email); printf("\t\tDom: "); scanf("%s",&addr[num].dom); printf("\t\tHome: "); scanf("%s",&addr[num].home); num++; printf("\n\t\tEnd adding?(Y/N):"); if(getch()=='n'||getch()=='N') add(); else menu(); } void show() { int i; if(num!=0) { printf("\n\t\t*********All the information below**********"); for(i=0;i<num;i++) { printf("\n\t\tNo. %d",i+1); printf("\n\t\tName: %s",addr[i].name); printf("\n\t\tID: %s",addr[i].ID); printf("\n\t\tClass:%s",addr[i].cla); printf("\n\t\tMajor:%s",addr[i].major); printf("\n\t\tTel: %s",addr[i].tel); printf("\n\t\tAge: %s",addr[i].age); printf("\n\t\tBirth:%s",addr[i].birth); printf("\n\t\tEmail:%s",addr[i].email); printf("\n\t\tDom: %s",addr[i].dom); printf("\n\t\tHome: %s\n\n",addr[i].home); } system("pause"); } else { printf("\n\t\tThere is no record!\n"); system("pause"); } menu(); } void modify() { } void del() { char s[20]; int i=0,j; if(num==0) { printf("\n\t\tThere is no records!"); getch(); menu(); } printf("\n\t\tPlease enter the name you want to delete:"); scanf("%s",s); for(j=0;j<=num-1;j++) { if(strcmp(addr[j].name,s)!=0) { if(j==num) { printf("\n\t\tError!didn't find the records."); continue; } } else { strcpy(addr[j].name,addr[j+1].name); strcpy(addr[j].ID,addr[j+1].ID); strcpy(addr[j].cla,addr[j+1].cla); strcpy(addr[j].major,addr[j+1].major); strcpy(addr[j].tel,addr[j+1].tel); strcpy(addr[j].age,addr[j+1].age); strcpy(addr[j].birth,addr[j+1].birth); strcpy(addr[j].email,addr[j+1].email); strcpy(addr[j].dom,addr[j+1].dom); strcpy(addr[j].home,addr[j+1].home); num--; printf("\n\t\tDelete successfully!"); } } printf("\n\t\tEnd deleting?(Y/N):"); if(getch()=='n'||getch()=='N') del(); else menu(); } void save() { FILE *fp; int i; if((fp=fopen("addressbook.dat","wb"))==NULL) { printf("\n\t\tOpen fail!"); exit(0); } else printf("success!"); for(i=0;i<=num;i++) { if((fwrite(&addr[i],sizeof(struct Addrbook),1,fp))!=1) { printf("%s",addr[i].name); } } fclose(fp); printf("\n\t\tPress any keys to get back to the menu."); getch(); menu(); } void read() { FILE *fp; int i; if((fp=fopen("addressbook.dat","rb"))==NULL) { printf("\n\t\tOpen fail!"); system("pause"); getch(); menu(); } else printf("success!"); system("pause"); for(i=0;i<num;i++) { if(fread(&addr[i],LEN,1,fp)!=1) printf("\n\t\tSomething wrong!\n"); } fclose(fp); }
@Suzy_C: 我运行了一下,是不是add以后,save以后,再次运行程序的时候,显示没有记录啊?是不是?但是查看文件,发现确实保存了。是不是这个问题?程序没有bug,就是有一些逻辑问题。在我这里,可以运行的。
@千紫小星: 输入数据再关闭,save以后再选2.show会有之前输入的数据显示出来吗?
@Suzy_C:
@Suzy_C: 你先看看我的贴图,你这个逻辑对吗?还是我哪里没有注意到。
@Suzy_C: 还有就是,你的读写文件的方式不对,现在你的方式,每次添加新的记录,就会把以前的记录覆盖掉,你的文件里面永远是上次运行程序时添加的记录。仔细看下书,这点书中有介绍的。
@千紫小星: 我加了个7.read选项,结果每次选完7,记录就没了。。。可是哪里错了呢?
@Suzy_C: 大概还是num没弄好,,,我已经知道错哪儿了,接下来慢慢改吧,谢谢ಥ_ಥ
@千紫小星: 终于弄对了ಥ_ಥ蟹蟹!