快速预订问题

#include  #pragma pack(push) #pragma (1) typedef struct contact { char firstname [40]; char lastname [40]; char address [100]; char phone[10]; }contact; #pragma pack(pop) int main () { FILE *pFile; contact entry = {"", "", "", ""}; char choice; pFile = fopen("C:\\contacts.txt", "w+"); if(!pFile){ printf("File could not be open"); return 1; } printf("Choose a selection\n\n"); printf("1. Enter First Name\n"); printf("2. Enter Last Name\n"); printf("3. Enter Address\n"); printf("4. Enter Phone Number\n\n"); scanf( "%d", &choice); switch (choice){ case 1: printf("First name: \n"); fgets(entry.firstname, sizeof(entry.firstname),pFile); break; case 2: printf("Last name: \n"); fgets(entry.lastname, sizeof(entry.lastname),pFile); break; case 3: printf("Address: \n"); fgets(entry.address, sizeof(entry.address),pFile); break; case 4: printf("Phone Number: \n"); fgets(entry.phone, sizeof(entry.phone),pFile); break; default: printf(" No Choice selected, Ending Address Book Entry system"); break; } fwrite(&entry, sizeof(contact), 1, pFile); printf("Enter a new contact?"); scanf("%s", &choice); //while(choice != 'n'); fclose(pFile); getchar(); return 0; } 

这个代码在我选择一个条目后,我输入一个条目并按下输入它崩溃说变量’条目’周围的堆栈已损坏。 我相信这是我正在使用的fwritefunction。 我知道fwrite寻找的第一个参数是一个指向要写入的元素数组的指针,但我想我现在很困惑。 任何帮助将非常感激。

你应该改变你所有的

 fgets(entry.firstname, sizeof(entry.firstname),pFile); 

 fgets(entry.firstname, sizeof(entry.firstname),stdin); 

因为您是从控制台读取的,而不是文件。

还有,用

 scanf("%s", &choice); 

 scanf( "%d", &choice); 

你正试图读取一个字符串和一个数字并将其存储在一个char 。 他们都应该

 scanf("%c", &choice); 

也就是说,你应该考虑使用ifstreamcingetlinestd::string重写这个,以便在你不寻求最大性能时让你的生活更轻松。