Как правильно работать с Tellg () и seekp () для выполнения этой задачи?

0
void edit_member()
{
    int ID;
    int slot;
    streampos pos;
    cout << "\n"
         << "Enter member ID#: ";
    cin.ignore();
    ID  = only_int();
    int mems = count_members();
    for (int a = 0; a < mems; a++)
    {
        if (ID == member[a].ID)
        {
            i_file.open("member_data.txt");
            for (int b = 0; b <= a; b++)
            {
                string void_data;
                getline(i_file, void_data, '#');
                pos = i_file.tellg();
                slot = a;
            }
            i_file.close();
            break;
        }
    }
    o_file.open("member_data.txt");
    cout << "\nEnter new name for ID# " << ID << ": ";
    cin.ignore();
    getline(cin, member[slot].name, '\n');
    o_file.seekp(pos) << member[slot].name;
    o_file.close();
    load();
}

Я пытаюсь перейти к определенной точке в файле и перезаписать имя, написанное там рядом с идентификатором-ответчиком. Первоначально я думал, что seekp() был похож на позиционирование курсора в текстовом редакторе, поэтому я сделал попытку позиционировать курсор в конце имени и "заполнить" "\ b" (backspace) для длины имя, которое эквивалентно

member[slot].name.length()

Я удалил бит кода, который слишком продвинул курсор, и отказался от идеи backspace. Теперь я пытаюсь поместить "курсор" в начало имени и написать над ним. Я также хочу удостовериться, что если новое имя короче старого, концы старого еще не присутствуют в файле.

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

Теги:
file-io

1 ответ

0
Лучший ответ
  1. запись в файл не похожа на ввод в блокнот или любой другой редактор файлов. когда вы помещаете какую-то строку, он не будет толкать остальных, он будет перезаписывать старый текст.

  2. Если значения не имеют одинакового размера, вам нужно будет записать всю оставшуюся часть файла после изменения. Если вы хотите этого избежать, вам нужно сохранить несколько пустых мест (пробелов) с размером и ограничить ввод той же шириной. и когда вы пишете новое значение, также давайте такую же ширину.

  3. вам нужно открыть внешний файл для чтения/записи, иначе он будет усечен.

РЕДАКТИРОВАТЬ:

//when you open the file in write only mode, its content deleted. 
//to keep the old file content, you need to open for both read and write:
fstream outfile;
outfile.open ("test.txt",ios::in|ios::out);
  • 0
    Я понимаю эти понятия, однако я все еще не понимаю, почему файл пишется с самого начала, несмотря на позиционирование с помощью seekp (). На самом деле я полагался на то, что текст после нового ввода будет обрезан. Вот что заставило меня принять решение отказаться от идиотизма.
  • 0
    Вы удаляете содержимое файла, когда открываете его, смотрите редактирование.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню