2016-12-05 9 views
-1

나는 사용자의 정보를 파일에로드하고 저장하는 프로젝트에서이 두 가지 기능을 사용한다. 각 사용자는 파일의 새 행에 저장됩니다. 내 문제는 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"); 
} 

답변

2

이 코드는 잘못된 것입니다 :

if(f=fopen("DATOS.txt","r")==NULL){ 

이진 연산자 - 같은 == 같은이 - = 등 - 대입 연산자보다 더 높은 우선 순위를 가지고 있습니다.

if(f=(fopen("DATOS.txt","r")==NULL)){ 

논리적 == 비교의 결과는 f에 할당됩니다로

그래서 코드는 구문 분석됩니다.

if 성명서에 과제물을 채우고 있습니까? 이 훨씬 명확뿐만 아니라되고있는 많은 적은 버그가 발생하기 쉬운 :

FILE *f = fopen("DATOS.txt", "r"); 
if (NULL == f) { 
... 

더 당신이 한 줄에 수행 가능성이 실수를 한 것입니다. 올바르게 프로그래밍하는 것은 충분히 어렵습니다. 더 많은 코드를 한 줄에 넣을 수 있는지 확인하는 등 더 어렵게 만드는 일을하지 마십시오.

+0

'(NULL == f)'는 불필요합니다. 당신은 간단히'(f)'를 쓸 수 있습니다, 기본적으로 자동적으로 0과 비교 될 것입니다. –

+0

고마워요! 나는 2 줄로 그것을 시도했지만, 분명히 그 시간을 잘못 해석했다. 적어도 그것은 내가 우선 순위의 중요성을 강화하게했다 !!! –

+0

@MDXF "'(NULL == f)'는 불필요하며 간단히'(f)'를 쓸 수 있습니다."(NULL == f)'는 (! f)'와 같습니다. 이제 왜 실제로 NULL을 비교하는 경향이 있는지 알 수 있습니다. –