我有一个程序将“朋友”信息存储到struct数组中并将其写入文件。没问题。但是,我如何能够修改和/或删除该结构数组中的特定元素?做了一些阅读并且它说我不能,除非我在删除之后将其全部改为一个。
所以我假设我需要读取它,然后将其删除,并将所有其他元素移到一个并再次写入...但是我该怎么做呢?试图只包括我到目前为止所需的代码。
为了修改它,我猜我会读它,然后询问我想要更改的特定元素#,然后将该元素中的所有值设置为null,然后允许用户输入新信息?这段代码看起来怎么样?
struct FriendList
{
char screenname[32];
char country[32];
char city[32];
char interests[32];
short age;
};
int main()
{
FriendList friends[num_friends];
const int num_friends = 2;
// Gets user input and puts it into struct array and writes to file
case 3:
{ // Getting info and putting in struct elements
for (index = 0; index < num_friends; index++)
{
// Create Friend Records
cout << "Enter Screename " << endl;
cin.ignore();
cin.getline(friends[index].screenname, 32);
cout << "Country: " << endl;
cin >> friends[index].country;
cout << "City: " << endl;
cin >> friends[index].city;
cout << "Age: " << endl;
cin >> friends[index].age;
}
counting += index;
fstream infile;
infile.open("friends.dat", ios::out | ios::binary |ios::app);
if(infile.fail())
{ cout << "File not found!\n\t";
// exit
}
// Writing struct to file
infile.write((char*)&friends, sizeof(friends));
infile.close();
break;
}
// Delete a friend ???
case 5:
{ // Reading in file contents into struct friends
// Then????
fstream outfile;
outfile.open("friends.dat", ios::in | ios::binary);
outfile.read((char*)&friends, sizeof(friends));
break;
}
答案 0 :(得分:3)
是的,它可以修改结构的成员。但是你不会在第一次清除记忆,你会在friends.dat
看到车库。
在main的上方,你最好添加memset()
。
memset(&friends, 0, sizeof(friends));
你使用ios :: app。我想friends
是完整数据集。那么,你应该删除ios :: app?
答案 1 :(得分:1)
更改相对容易 - 只需阅读正确的条目,在内存中更新并回写。为了删除我建议如下:
阅读您需要删除的条目后的所有条目
将这些条目写入已删除条目的偏移量
将fuile截断到新的长度
这是一个简单的方法
答案 2 :(得分:1)
听起来你想要std :: deque或std :: vector取决于用法。
如果您不经常删除项目,请使用std :: vector而不是固定数组:
std::vector<FriendList> friends;
添加新朋友:
friends.push_back(newFriend);
通过索引访问朋友与访问数组相同:
friends[index]
要删除向量中的条目,请使用erase()(而不是remove()!):
friends.erase(friends.begin() + index)
答案 3 :(得分:1)
你可以删除一个方法,在你要删除的朋友之后拉出朋友,将信息移动到当前结构,然后继续,直到没有更多的朋友。