Как искать и заменять данные / строку в открытом файле - PullRequest
0 голосов
/ 17 июня 2020

Привет, ребята, я новичок в файлах. Мне нужно найти определенные c данные (KJadid.Tedad) и заменить в них какое-то другое целое число. вот код, который я использую:

    fseek(fileKALAJADIDptr, 0, SEEK_SET);

    int mojoodi, shomare;
    scanf("%d", &shomare);
    scanf("%d", &mojoodi); 

    int i = 0;
    while (fread(&KJadid, sizeof(struct KalaJadid), 1, fileKALAJADIDptr))
    {
        if (i == shomare - 1)
        {
            KJadid.Tedad = mojoodi;
            fseek(fileKALAJADIDptr, (shomare - 1) * sizeof(struct KalaJadid), SEEK_SET);
            fwrite(&KJadid, sizeof(struct KalaJadid), 1, fileKALAJADIDptr);
            break;
        }
        i++;
    }
    fclose(fileKALAJADIDptr);

с fseek I go в начало файла, затем получите shomare & mojoodi («shomare» - это структура, данные которой я хочу изменить, а «mojoodi» "- новые данные), затем я читаю файл, пока не достигну нужной структуры, затем я использую fseek для замены данных там, где они были, и использую fwrite для записи данных в файл, но когда я распечатываю данные (которые я использую этот код for:)

int i = 0;
while (fread(&KJadid, sizeof(struct KalaJadid), 1, fileKALAJADIDptr))
{
    printf("\n\n\n\tID: %d \t %s \t Gheymat: %d \t Tedad: %d \t Emtyaz: %d \t Daste Bandi: %s \n\n\t 
    Sharh Kala: \n\n\t\t %s", i + 1, KJadid.EsmKala, KJadid.Gheimat, KJadid.Tedad, KJadid.Emtiaz, 
    KJadid.DasteBandi, KJadid.Sharh);
    i++;
}

он распечатывает все данные, которые были у него раньше, и, наконец, печатает новые данные (ничего не заменяет, просто добавляет данные в конец файла)

вы ребята спросили, как я открыл файл:

FILE* fileKALAJADIDptr = fopen(fileKALAJADID, "a+b");
if (fileKALAJADIDptr == NULL)
{
    fopen(fileKALAJADID, "w+");
}

что мне делать, чтобы просто заменить данные, а не записать все это в конце? помогите пожалуйста

1 Ответ

1 голос
/ 17 июня 2020

Вы открываете файл в неправильном режиме:

«Когда файл открывается с типом доступа« a »или« a + », все операции записи происходят в конце файла. Указатель файла можно переместить с помощью fseek или rewind, , но он всегда перемещается назад в конец файла перед выполнением любой операции записи. Таким образом, существующие данные не могут быть перезаписаны."

Открыть файл в режиме «r +» - открывает файл как для чтения, так и для записи. (Файл должен существовать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...