나는 사용자의 정보를 파일에로드하고 저장하는 프로젝트에서이 두 가지 기능을 사용한다. 각 사용자는 파일의 새 행에 저장됩니다. 내 문제는 ftell (f)를 사용하려고 할 때 프로그램이 충돌한다는 것입니다. ftell (f)를 인쇄 할 때 fopen()을 사용하여 파일을 열면 -1이 인쇄됩니다. 나는 errno에서 에러를 보았습니다 만, fopen()하지만 "잘못된 에러"를 인쇄 한 후에는 fseek를 사용하여 파일 포인터 f 위치를 수정했습니다.왜 ftell은 파일 포인터의 값으로 -1을 출력합니까? 왜 errno가 "INVALID ARGUMENT"를 출력합니까?
내 문제는 내 Load_File 함수에 있지만 파일에 올바르게 쓰는지 확인하기 위해 Save_File 함수도 표시합니다.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
LIST Load_File(LIST L){
//PRE: receive a void list (L==NULL)
//POST: returns an user's loaded from file
USER user; //node of list
char str[150];
//User's structure
char name[30];
char CI[10];
char email[30];
char city[30];
char password[30];
errno=0;
FILE *f;
if(f=fopen("DATOS.txt","r")==NULL){
printf("File not found. \n");
return L;
}
//Code for verify what's happening
printf("FTELL: %d/n", ftell(f)); //prints -1
printf("ERRNO: %s\n", strerror(errno)); //prints NO ERROR
fseek(f, 0, SEEK_CUR);
printf("FTELL: %d\n", ftell(f)); //still prints -1
printf("ERRNO: %s\n", strerror(errno)); //prints INVALID ARGUMENT
printf("FEOF: %d\n",feof(f)); //CRASHES! (a)
while(feof(f)==0){ //CRASHES when (a) line is deleted
//Load line of file in user's structure
fgets(str, 150, f);
sscanf(str,"%s %s %s %s %s ",name, CI, email, city, password);
//Copy into structure's parts
strcpy(user->name, name);
strcpy(user->CI, CI);
strcpy(user->email, email);
strcpy(user->city, city);
strcpy(user->password, password);
Add_user_to_list(L, user);
}
if(fclose(f)!=0) printf("\n\n FILE NOT PROPERLY ClOSED \n\n");
}
void Save_File(LIST L){
//PRE: receive an user's list
//POST: saves a new list in file
FILE *f;
int flag=0;
f=fopen("DATOS.txt","w");
if(f==NULL){
printf("Error opening file f\n");
}
if(!L_Void(L)){
L=L_First(L);
do{
if(flag) L=L_Next(L);
flag=1;
fprintf(f,"%s %s %s %s %s \n",L_InfoM(L)->name,L_InfoM(L)->CI, L_InfoM(L)->email, L_InfoM(L)->city, L_InfoM(L)->password);
}while(!L_Final(L));
}else printf("List is void, then nothing was saved.\n");
if(fclose(f)!=0) printf("\n\n FILE NOT PROPERLY COSED \n\n");
}
'(NULL == f)'는 불필요합니다. 당신은 간단히'(f)'를 쓸 수 있습니다, 기본적으로 자동적으로 0과 비교 될 것입니다. –
고마워요! 나는 2 줄로 그것을 시도했지만, 분명히 그 시간을 잘못 해석했다. 적어도 그것은 내가 우선 순위의 중요성을 강화하게했다 !!! –
@MDXF "'(NULL == f)'는 불필요하며 간단히'(f)'를 쓸 수 있습니다."(NULL == f)'는 (! f)'와 같습니다. 이제 왜 실제로 NULL을 비교하는 경향이 있는지 알 수 있습니다. –