2012-11-17 4 views
0

파일을 읽고 쓸 수있는 기능을 제공하려는 전화 번호부 응용 프로그램이 있습니다. 파일을 작성하는 방법을 아주 쉽게 알아 냈습니다. 그러나 그것들을 읽으면 정말로 저를 붙잡 았습니다. 내 주요 문제는 파일을 루프를 얻을 수 없다는 것입니다 (일반적으로 루프를 치는 즉시 충돌). 나의 밑에있는 기능은 다음과 같습니다.파일에서 데이터를 가져 오는 중에 크래시가 발생했습니다.

다음은 구조, 주 및 메뉴 기능입니다.

typedef struct friends_contact{ 

    char *First_Name; 
    char *Last_Name; 
    char *home; 
    char *cell; 
}fr; 
int main() { 


fr friends[5]; 
char buffer[BUFFSIZE]; 
int counter=0; 
int i=0; 

menu(friends, &counter,i,buffer); 

getch(); 
return 0; 
} 
//Menu function 
void menu(fr*friends,int* counter, int i,char buffer[]) { 
int user_entry=0; 
int user_entry2=0; 
char user_entry3[50]={'\0'}; 

printf("Welcome! Would you like to import a file? (1)Yes or (2) No"); 
scanf("%d",&user_entry); 
if(user_entry==1) 
    { 

    file2(friends,counter,i,user_entry3); 


    }else; 
do{ 
    int result; 

printf("\nPhone Book Application\n"); 
printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit\n"); 
scanf("%d", &user_entry); 


if(user_entry==1) 
    { 
     add_contact(friends,counter,i,buffer); 
    } 
    if(user_entry==2) 
    { 
     delete_contact(friends ,counter,i); 
    } 
    if(user_entry==3) 
    { 
     result=show_contact(friends ,counter,i); 
     if(result==0){ 
        printf("\nName not Found\n"); 
        }else{ 
         result; 
         } 

    }     
    if(user_entry==4) 
    { 
     print_contact(friends, counter,i,user_entry3); 
     file2(friends ,counter,i,user_entry3); 

    } 
}while(user_entry!=5); 
    if(user_entry==5) 
    { 
     printf("Would you like to save entries to a file? (1)yes or (2) no"); 
     scanf("%d",&user_entry2); 
     if(user_entry2 == 1) 
     { 
      printf("Please name your file"); 
      scanf("%s",user_entry3); 
      file(friends, counter,i,user_entry3); 
      printf("Goodbye!"); 

     }else if(user_entry2 == 2){ 
      printf("Goodbye!"); 
     } 
    } 

} 

다음은 파일 읽기를 처리하는 기능입니다. 그래서이 진행중인 작품이다

void file2(fr*friends ,int* counter, int i, char user_entry3[50]) 
{ 

    FILE *read; 

    printf("Please enter a file name"); 
    scanf("%s",user_entry3); 
    read=fopen(user_entry3,"r"); 
    //This is where the crash is taking place!!** 
    while(!feof(read)){ 
     fscanf(read,"%s %s %s %s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell); 
     printf("\n""%s ""%s ""\n""<Home>""%s""\n""<Cell>""%s""\n",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell); 

     } 

지금 내가 부탁 해요 무슨 관련이없는 프로그램에 다른 문제가있을 수 있습니다 이해하지만, 나는 C에 새로운 오전. 나는 충돌로부터 이것을 멈출 수있는 방법을 알아야하고 나머지 연락처 (이것은 내가 생각할지도 모른다고 생각한다)에이를 추가하는 방법을 알아야한다. 그것은 나를 미치게 만든다! 미리 감사드립니다.

답변

1

데이터를 정의되지 않은 메모리 영역으로 읽는 중입니다. 구조체에서 4 개의 문자열 포인터에 값을 할당하지 마십시오. friends[i].First_Name, .Last_Name, .home.cell에 대한 메모리 할당을 보지 못했습니다.

당신이처럼 구조체 변경할 수 있습니다 : 파일이 더 이상 다음 ('\ 0'종료 포함) 50 자 일부를 포함하는 경우, 물론

typedef struct friends_contact{ 
    char First_Name[50+1]; // +1 for the '\0' terminating character 
    char Last_Name[50+1]; 
    char home[50+1]; 
    char cell[50+1]; 
}fr; 

를, 코드가 있기 때문에, 다시 충돌합니다 당신이 당신의 구조체에 포인터를 사용하려면

fscanf(read,"%50s %50s %50s %50s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell); 

, 당신은 각 구조체 멤버에 메모리를 할당해야 befor을 malloc()를 사용 :이 같은 각 문자열의 최대 길이를 지정하지 않는 fscanf는 길이를 확인하지 않습니다 더 이상 필요하지 않으면 할당 된 메모리를 읽으려면 읽기를 사용하고 free()을 사용하십시오.

+0

전에 내가 말했듯이 전화 번호부 앱 이었으므로 분명히이 세 가지 기능 만 있습니다. 나는 사용자에게 연락처를 입력 할 수있는 곳이 있으며, 이렇게하는 동안 나는'malloc'과'free'를 사용합니다. 당신의 말은 데이터를 읽을 때'malloc'과'free'를 추가해야합니다. – DatDudeJC

+0

만약 당신이 메모리를 할당하지 않는다면, 그 포인터는 정의되지 않은 메모리 영역을 가리키고 있습니다. 그렇기 때문에, 그 멤버들로 데이터를 읽으려면, 우선 그 메모리를 할당해야합니다. 그 안에있는 데이터를 읽고 그것을 인쇄하고 다시 해방하십시오. 하지만 당신은 구조체에 미리 정의 된 길이의 문자열을 사용하는 것을 고려해 볼 수 있습니다. 그것은 당신에게 많은 문제와 메모리 누출을 저장합니다;) –

+0

메모리 누수가 이상한 무한 루프를 유발할 수 있습니까? 나는 그것이 파일을 읽고 연락처 목록에 추가하는 작업을하지만 연락처 목록을보고 목록을 다시 보려고하면 무한 루프가됩니다. – DatDudeJC

관련 문제