Удалить / изменить элемент в массиве struct - PullRequest
1 голос
/ 22 июня 2011

У меня есть программа, которая хранит информацию о «друзьях» в массиве struct и записывает ее в файл.Нет проблем там.Но как бы я мог изменить и / или удалить определенный элемент в этом массиве структуры?Прочитал, и он говорит, что я не могу, если я не переместил все это на единицу после удаления в.другие элементы по одному и напишите это снова ... но как бы я это сделал?Попытка включить только необходимый код, который у меня есть.

Для его изменения, я бы предположил, что я прочитал бы его, затем спросил бы определенный элемент # Я хочу изменить, а затем установить все значенияэтот элемент в ноль, а затем разрешить пользователю вводить новую информацию?Как будет выглядеть этот код?

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

Ответы [ 4 ]

3 голосов
/ 22 июня 2011

Да, это может изменить член структуры.Но сначала вы не очищаете память, вы увидите гаражи в friends.dat.в верхнем из основных вам лучше добавить memset().

memset(&friends, 0, sizeof(friends));

И вы используете ios :: app.Я предполагаю, что friends это полные данные.Затем вы должны удалить ios :: app?

Кстати, в последнее время о C ++, большинство c ++ er не использует двоичный файл для подобных случаев.:)

1 голос
/ 22 июня 2011

Звучит так, будто вам нужен либо std :: deque, либо std :: vector в зависимости от использования.

Если вы удаляете элементы нечасто, используйте вместо стандартного массива std :: vector:

std::vector<FriendList> friends;

чтобы добавить новых друзей:

friends.push_back(newFriend);

доступ к другу по индексу аналогичен обращению к массиву:

friends[index]

чтобы удалить запись в векторе, используйте erase () (not remove ()!):

friends.erase(friends.begin() + index)
1 голос
/ 22 июня 2011

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

1 голос
/ 22 июня 2011

Изменить относительно легко - просто прочитайте нужную запись, обновите ее в памяти и напишите обратно.Для удаления я предлагаю следующее:

  1. Прочитать все записи после того, как вам нужно удалить

  2. Запишите эти записи в смещениииз удаленных записей

  3. Обрезать файл до новой длины

Это тривиальный подход

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...