2014-12-08 2 views
0

파일을 읽고 다른 파일에 쓰는 것이 잘못되어 있다는 것을 지적하기 위해 도움이 필요합니다. 문제는 필자의 출력 파일에 결과를 작성해야하는 것이 아무것도 없다는 것입니다. 현재 내 programm을 수정 중 Can't deallocate memory in my C program. 이제 커맨드 라인 인자를 읽고 쓰고 지금까지 성공하지 못했습니다. 내 기능에 오류가 있다고 생각하지만 해결 방법을 모릅니다. 여기에 기능이C에서 파일에서 파일로 읽고 쓰는 데 문제가 발생했습니다.

void getinfo(student *details[], int *count, FILE *fp1) 
    { 

     studinfo info; 

     /*Get student information*/ 
     while (fp1 != NULL) { 
      info = (studinfo)malloc(sizeof(student)); 
      fgets(info->name, 40,fp1); 
      fgets(info->street, 40,fp1); 
      fgets(info->citystate,40,fp1); 
      fgets(info->zip, 40, fp1); 

      details[(*count)++] = info; /*Increase pointer to next position*/ 

     } /* End of while loop*/ 

    } /* End of getinfo */ 

를 파일에서 정보를 읽고 내가 의심 어디에 내 오류가해야

typedef struct{ 
char name[25]; 
char street[25]; 
char citystate[25]; 
char zip[6]; 
}student; 

    typedef student *studinfo; 

int main(int argc, char *argv[]) 
    { 
     FILE *fp1, *fp2; /* file pointer */ 

     /* see if correct number of command line arguments */ 
     if (argc != 3) { 
      printf("Something wrong with arguments\n"); 
      exit(1); 
     } 

     /* open file for input */ 
     if ((fp1 = fopen(argv[1], "r")) == NULL) { 
      printf("Cannot open file to read \n"); 
      exit(1); 
     } 

     fp2 = fopen(argv[2], "w"); 

     int count = 0; 
     student *studptr[49]; 

     getinfo(studptr, &count, fp1);/*call getinfo function to get student info*/ 

     sortit(studptr, count); /*call sortit function to sort info based on zip code*/ 

     result(studptr, &count, fp2); /*call result function to display sorted result*/ 

     fclose(fp1); 
     fclose(fp2); 

     return 0; 
    } 

내 기능 내 구조체 데프와 주() FUNC 간다 우편 번호를 기반으로 정보를 정렬하고 정렬 된 결과를 아래에 제시된 새 파일에 쓰는 다음 함수

void result(student *details[], int *count, FILE *fp2) 
    { 
     int i; 
     for (i = 0; i<(*count); i++) { 

      fprintf(fp2,"%s\n%s\n%s\n%s\n", details[i]->name, details[i]->street, details[i]->citystate, details[i]->zip); /* print info*/ 
      fprintf(fp2, "*******************************\n"); 
     } 
    } /* End of result* 
+1

왜'fp2'에 대한 어떤 검사? 또한'typedef student * studinfo;가 아닌'typedef student * studinfo; '를 정말로 원하십니까? 또한 읽을 파일의 내용을 보여주지 마십시오. –

+2

구조체는 크기가 25 인 필드를 정의합니다 (우편 번호는 6을 제외하고). 'fgets()'호출은 크기가 40이라고 가정합니다. 누군가 24 바이트 이상의 데이터를 입력하면 행복하지 않을 것입니다. 'fgets (info-> name, sizeof (info-> name), fp1)'및 이와 동등한 것을 사용하십시오. 또한, EOF (fgets()의 반환 값은 EOF에서 NULL)인지 확인한다. 또한'fgets()'에는 데이터에 개행 문자가 포함됩니다. 너는 그걸 원하지 않을거야. –

+0

이전 주석에서 나는 주목했다 : 또한'fgets()'는 데이터에 개행 문자를 포함한다. 너는 그걸 원하지 않을거야. 필자는 다음을 추가해야합니다. ... 적어도 네 자리 우편 번호와 개행을 더한 다음 6 문자 배열에 null을 저장할 수 있기 때문입니다. 문자열을 큰 배열 (char buffer [4096];와'fgets (buffer, sizeof (buffer), fp1);)로 더 잘 읽고, 입력의 길이를 확인하고 개행 문자를 압축 한 다음, 과도한 우편 번호에 대해 걱정할 필요가 없습니다. 'strncpy()'는 너무 긴 문자열을 널 종료하지 않는다는 것을 기억하십시오. –

답변

0
int get_line(FILE *fp, char *buffer, size_t buflen) 
{ 
    char line[4096]; 
    assert(buflen > 1); 
    if (fgets(line, sizeof(line), fp) == 0) 
     return EOF; 
    size_t len = strlen(line); 
    if (line[len-1] == '\n') 
     line[--len] = '\0'; 
    if (len >= buflen) 
     len = buflen - 1; 
    memmove(buffer, line, len); 
    buffer[len] = '\0'; 
    return len; 
} 

void getinfo(student *details[], int *count, FILE *fp) 
{ 
    student *info; 

    while ((info = malloc(sizeof(*info)) != 0) 
    { 
     if (get_line(fp, info->name, sizeof(info->name)) == EOF || 
      get_line(fp, info->street, sizeof(info->stree)) == EOF || 
      get_line(fp, info->citystate, sizeof(info->citystate)) == EOF || 
      get_line(fp, info->zip, sizeof(info->zip)) == EOF) 
     { 
      free(info); 
      return; 
     } 
     details[(*count)++] = info; 
    } 
} 
0

while (fp1 != NULL) { : 무한 루프. - BLUEPIXY

실제로 이것이 주된 문제입니다.

나는 while (fgetc(fp1) != EOF) { 시도 : fgetc() 나중에 누락 된 문자를 소비하기 때문에 잘 작동하지 않습니다

를 작동하지 않았다.

당신은 이름 전에 폐기 공간의 보너스, 다음을 사용할 수

 while (fscanf(fp1, "%*[ ]") != EOF) 
     { 
      … 
관련 문제