파일을 읽고 다른 파일에 쓰는 것이 잘못되어 있다는 것을 지적하기 위해 도움이 필요합니다. 문제는 필자의 출력 파일에 결과를 작성해야하는 것이 아무것도 없다는 것입니다. 현재 내 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*
왜'fp2'에 대한 어떤 검사? 또한'typedef student * studinfo;가 아닌'typedef student * studinfo; '를 정말로 원하십니까? 또한 읽을 파일의 내용을 보여주지 마십시오. –
구조체는 크기가 25 인 필드를 정의합니다 (우편 번호는 6을 제외하고). 'fgets()'호출은 크기가 40이라고 가정합니다. 누군가 24 바이트 이상의 데이터를 입력하면 행복하지 않을 것입니다. 'fgets (info-> name, sizeof (info-> name), fp1)'및 이와 동등한 것을 사용하십시오. 또한, EOF (fgets()의 반환 값은 EOF에서 NULL)인지 확인한다. 또한'fgets()'에는 데이터에 개행 문자가 포함됩니다. 너는 그걸 원하지 않을거야. –
이전 주석에서 나는 주목했다 : 또한'fgets()'는 데이터에 개행 문자를 포함한다. 너는 그걸 원하지 않을거야. 필자는 다음을 추가해야합니다. ... 적어도 네 자리 우편 번호와 개행을 더한 다음 6 문자 배열에 null을 저장할 수 있기 때문입니다. 문자열을 큰 배열 (char buffer [4096];와'fgets (buffer, sizeof (buffer), fp1);)로 더 잘 읽고, 입력의 길이를 확인하고 개행 문자를 압축 한 다음, 과도한 우편 번호에 대해 걱정할 필요가 없습니다. 'strncpy()'는 너무 긴 문자열을 널 종료하지 않는다는 것을 기억하십시오. –