2016-12-05 2 views
-1

私はこれらの2つの機能を、ユーザーの情報をファイルにロードして保存するプロジェクトに持っています。各ユーザーはファイルの新しい行に保存されます。私の問題は、ftell(f)を使用しようとするとプログラムがクラッシュすることです。 ftell(f)を出力すると、fopen()でファイルを開いた後に-1が出力されます。私はerrnoにエラーを見ようとしましたが、fopen()の後に "NO ERROR"を表示しますが、fseekを使ってファイルポインタの位置を変更すると "INVALID ARGUMENT"を出力します。なぜ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ステートメントに割り当てをスタッフィングしているのはなぜですか?より多くのあなたがミスを犯すだろう可能性が高い1行に行う

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

:これは非常に明確であるだけでなく、たくさん少ないバグが発生しやすいこと。正しくプログラミングするのは難しいです。どのように多くのコードを1行に収めることができるかを試すように、難しくするようなことはしないでください。

+0

'(NULL == f)'は不要です。基本的に自動的に0と比較されるので '(f)'と書くことができます。 –

+0

ありがとう!私は2行でやろうとしましたが、その時の結果を間違って誤解しました。少なくとも私は優先順位の重要性を強化しました! –

+0

@MDXF "'(NULL == f) 'は不要です;単純に'(f) 'と書くことができます。'(NULL == f) 'は'(!f) 'と等価です。これで、なぜ私が実際にNULLを比較する傾向にあるのかが分かります。 –

関連する問題