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;在名称的开头并写下它。我还想确保如果新名称比旧名称短,那么旧名称的末尾仍然不存在于文件中。
目前发生的情况是整个文件被删除,新名称仅出现在文件的开头。我是一个自学成才,但仍然非常基础,但任何帮助都会非常感激。
答案 0 :(得分:0)
写入文件与输入记事本或任何其他文件编辑器不同。当你输入一些字符串时,它不会推动其余字符串,它将覆盖旧文本。
如果值不具有相同的大小,则您需要在更改后写入文件的所有其余部分。如果你想避免它,你需要保留一些大小的空位(空格)并将输入限制为相同的宽度。当你写新值时也给出相同的宽度。
你需要打开out文件进行读/写,否则会被截断。
修改强>
//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);