Перезапись файлов с использованием tellg () и seekp () - PullRequest
0 голосов
/ 25 декабря 2018

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

В файле .txt хранится список пользователей, каждый из которых определен как таковой:

 UserType:FirstName:LastName:Email:Password:endl:

Задача метода, отвечающего за внесение изменений, состоит в том, чтобы проанализировать файл и изменить лагерь электронной почты.

Он требует ввода объекта User и нового адреса электронной почты, который должен быть зарегистрирован.

void userContainer::modifyEmail(User & u, string newmail){
    fstream user_file;
    string temp;
    user_file.open("users.txt");
    while(!(user_file.eof())){
        getline(user_file,temp,':');

        if(temp==u.getEmail()){
            //save position of the email string
            long pos=user_file.tellg();
            //copy user data following the email
            string remaining_data;
            getline(user_file,remaining_data,'\n');
            //overwrite with newmail
            user_file.seekp(pos-(temp.size()+1));//positioning the pos value at the beginning of the email camp
            user_file.write(&newmail[0],newmail.size()); //overwriting with the new mail
            //writing remaining data;
            user_file.write(&remaining_data[0], remaining_data.size()); 
        }
    }
    user_file.close();
}

После запуска метода без изменений не применяется к файлу users.txt.Строка «Остальные_данные», однако, правильно регистрирует строки, следующие за лагерем электронной почты.

Удаление части кода, использующей строку оставшиеся_данные, изменяет файл, но, очевидно, не так, как я хочу:

void userContainer::modifyEmail(User & u, string newmail){
    fstream user_file;
    string temp;
    user_file.open("users.txt");
    while(!(user_file.eof())){
        getline(user_file,temp,':');
        if(temp==u.getEmail()){
            //save position of the email string
            long pos=user_file.tellg();
            //overwrite with newmail
            user_file.seekp(pos-(temp.size()+1));
            user_file.write(&newmail[0],newmail.size());
        }
    }
    user_file.close();
}

Пример:

Перед вызовом modifyEmail:

admin:Cristiano:Ronaldo:cr7@fluffymail.com:cri7madr1d:endl:

После вызова modifyEmail (без использования оставшихся_данных)

admin:Cristiano:Ronaldo:banana100000@hotmail.itmadr1d:endl:

Требуемое поведение послевызов метода

admin:Cristiano:Ronaldo:banana100000@hotmail:cri7madr1d:endl:

1 Ответ

0 голосов
/ 25 декабря 2018

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

Я оставлю еготам, я уверен, вы можете справиться, если вы прислушаетесь к комментариям выше.

...