Почему ftell печатает -1 как значение указателя файла? А почему errno распечатывает "НЕВЕРНЫЙ АРГУМЕНТ"?

У меня есть эти 2 функции в проекте, который загружает и сохраняет информацию пользователя в файл. Каждый пользователь сохраняется в новой строке файла. Моя проблема в том, что программа вылетает, когда я пытаюсь использовать ftell(f). Когда я печатаю ftell (f), он печатает -1 после открытия файла с помощью fopen(). Я попытался увидеть в errno ошибку, но она печатает "NO ERROR" после fopen (), но "INVALID ARGUMENT", как только я использую fseek для изменения позиции указателя файла f.

Моя проблема в моей функции 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");
}

1 ответ

Решение

Этот код неверен:

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 ) {
...

Чем больше вы делаете в одной строке, тем больше вероятность, что вы допустите ошибку. Правильное программирование достаточно сложно. Не делайте вещей, которые усложняют задачу - например, пытайтесь увидеть, сколько кода вы можете поместить в одну строку.

Другие вопросы по тегам