如何正确操作tellg()和seekp()来完成此任务?

时间:2014-04-07 05:52:02

标签: c++ file-io

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();
}

我正在尝试导航到文件中的特定点,并覆盖在同一个ID#旁边写的名称。我最初认为seekp()类似于将光标定位在文本编辑器中,所以我所做的是尝试将光标定位在名称的末尾并且&#34;填充&#34;用&#39; \ b&#39; (退格)表示名称的长度,相当于

member[slot].name.length()

我删除了一些使光标前进太远的代码,并放弃了退格的想法。现在我试图把光标放在&#39;在名称的开头并写下它。我还想确保如果新名称比旧名称短,那么旧名称的末尾仍然不存在于文件中。

目前发生的情况是整个文件被删除,新名称仅出现在文件的开头。我是一个自学成才,但仍然非常基础,但任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

  1. 写入文件与输入记事本或任何其他文件编辑器不同。当你输入一些字符串时,它不会推动其余字符串,它将覆盖旧文本。

  2. 如果值不具有相同的大小,则您需要在更改后写入文件的所有其余部分。如果你想避免它,你需要保留一些大小的空位(空格)并将输入限制为相同的宽度。当你写新值时也给出相同的宽度。

  3. 你需要打开out文件进行读/写,否则会被截断。

  4. 修改

    //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);