Удалить данные структуры из текстового файла в C

Я получил данные от пользователя и сохранил их в структуре, а затем записал их в текстовый файл, используя

fwrite(&a[i],sizeof(a[i]),1,file);

Теперь я хочу удалить определенные индексные данные структуры, хранящиеся в файле. Вот что я пытался сделать.

void deletespecific()
{
    int delroll;
    printf("ENTER THE ROLL NUMBER TO DELETE: ");
    scanf("%d",&delroll);
    readdata();  //reads all data stored in the file
    file=fopen("Records.txt","w");
    for (int w=0;w<t;w++)
    {
        if(a[w].roll!=delroll)
        {
            fwrite(&a[w],sizeof(a[w]),1,file);
        }
    }
    fclose(file);
    printf(Green"DATA SUCCESSFULLY DELETED!\n"Reset);
 }

Я сначала прочитал все данные, хранящиеся в файле, в структуру, а затем записал их в файл только в том случае, если рулон не был равен удаляемому рулону.

Проблема заключается в том, что каждый раз, когда я запускаю функцию "deletespecific", она удаляет последние проиндексированные данные.

И это всего лишь функция чтения данных:

void readdata()
{
    t=0;
    file=fopen("Records.txt","r");

    while(fread(&a[i],sizeof(a[i]),1,file)==1)
    {
        i++;
        t++;
    }
    fclose(file);
}

EDIT: я не инициализировал i как 0 в readdata. Это обновленная функция чтения данных:

void readdata()
{
    i=0;
    t=0;
    file=fopen("Records.txt","r");

    while(fread(&a[i],sizeof(a[i]),1,file)==1)
    {
        i++;
        t++;
    }
    fclose(file);
}

Если вам нужен полный код: полный код


person Bijan Regmi    schedule 03.03.2020    source источник
comment
Почему в readdata() два счетчика i и t? Почему они глобальны? Почему вы не инициализируете i?   -  person Johnny Mopp    schedule 03.03.2020
comment
При обращении за помощью по отладке обязательно публикуйте полный набор кода. Если мы не сможем воспроизвести проблему, мы не сможем помочь вам с ней. См. минимально воспроизводимый пример.   -  person user3386109    schedule 03.03.2020
comment
В зависимости от операционной системы вам может понадобиться использовать "rb" и "wb" в вызове fopen.   -  person user3386109    schedule 03.03.2020
comment
Является ли t глобальной переменной?   -  person 4386427    schedule 03.03.2020
comment
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я запускаю функцию удаления, она удаляет последние проиндексированные данные. Как вы это видите?   -  person 4386427    schedule 03.03.2020
comment
как объявляется a[], чтобы он был достаточно большим, чтобы вместить весь файл?   -  person user3629249    schedule 03.03.2020
comment
Что такое i? Глобальная переменная, которая не обнуляется при запуске нового чтения?   -  person 4386427    schedule 03.03.2020
comment
в функции readdata() i ни к чему не относится. Предлагаю заменить все ссылки на i на t   -  person user3629249    schedule 03.03.2020
comment
@JohnnyMopp, как вы сказали, я инициализировал i в readdata, и теперь проблема исправлена.   -  person Bijan Regmi    schedule 03.03.2020
comment
github.com/BijanRegmi/finalproject это полная версия. Теперь все в порядке.   -  person Bijan Regmi    schedule 03.03.2020


Ответы (1)


переменная t, глобальная переменная, представляет собой смещение (начинается с 0) в массиве a[].

Следовательно, его содержимое на 1 меньше, чем количество записей в массиве a[], а не количество записей в массиве a[].

person user3629249    schedule 03.03.2020