私はこれらの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");
}
'(NULL == f)'は不要です。基本的に自動的に0と比較されるので '(f)'と書くことができます。 –
ありがとう!私は2行でやろうとしましたが、その時の結果を間違って誤解しました。少なくとも私は優先順位の重要性を強化しました! –
@MDXF "'(NULL == f) 'は不要です;単純に'(f) 'と書くことができます。'(NULL == f) 'は'(!f) 'と等価です。これで、なぜ私が実際にNULLを比較する傾向にあるのかが分かります。 –