singlepost

Чтение данных << На главную или назад  

Есть файл с данными:

1 Зорий Олег
2 Федоров Юрий
3 Дмитер Оксана
.....

данные из него нужно занести в массив стуктур:

struct List {
char last_name[64];
char name[64];
};
List mas[100];

но номер строки нужно игнорировать.

Я сделал так:

ifstream file("file.dat", ios::in);
int tmp;
for(int i=0; !file.eof()&&i<100; i++ ) {
file >> tmp >> mas[i].last_name >> mas[i].name;
}

Вопрос: может есть какой-то другой способ игнорировать лишние данные?

10 ответов в теме “Чтение данных”

  1. 1
    Владимир Рудой ответил:

    [code]
    char last_name; // Один символ для прізвища ?
    int name;//Ім'я - ціле число ?
    [/code]

    Вчитись, вчитись і ще раз вчитись….

  2. 2
    Володя Квич ответил:

    Вже виправив, сорі…

  3. 3
    Жека Кирпичев ответил:

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

  4. 4
    Володя Квич ответил:

    Не вопрос… пожалуйста.

  5. 5
    Жека Кирпичев ответил:

    Спасибо.

  6. 6
    Дмитрий Гайдамович ответил:

    >> может есть какой-то другой способ игнорировать лишние данные?

    Володя, тебе не нравится tmp, которая никому не нужна? Ну так если использоватьклассы потоков С++ и перегруженные для разных типов операторы >>(), то мы вынуждены "подсунуть" ссылку на переменную интересующего типа: этим мы задаём способ "вычитки" данных для данного типа. Какие могут быть альтернативы? Все они основываются на отказе от использования >>(). Например.

    1) Вычитывать посимвольно. Организоватьцикл, где первым оператором будет "взять очередной символ", а дальше – действия в зависимости от того, какой это символ (конструкция switch-case). Конечно, нужно буферизовать. Если я не ошибаюсь, ifstream поддерживает внутренний буфер? Очевидно, что при этом нужно завести переменную для указаниятого, какую часть мы сейчас читаем (имя или фамилию), и куда "складывать" очередной символ, а также обрабатывать конец строки.

    2) Вычитывать построчно. Завести буфер для очередной получаемой строчки, в цикле получать заполнять его из файла, и, определяя в полученной строчке, где там границы нужных полей,уже оттуда отправлять всякими strncpy() в нужные места. Это напоминает связку readLine-split в каких-нибудь скриптах, только более производительную, потому что мы не создаём массив строк, как это делает split.

    Как 1, так и 2 – более низкоуровневые способы, чем перегруженные >>() и манипуляторы. Их имеет смысл использовать только если не хочешь "тащить" потоки C++, ну, к примеру, для уменьшения размера exe-шника. А так, как у тебя написано, – мне кажется, это наиболее просто и наглядно, несмотря на "лишнюю" tmp.

    Только непонятно, почему твоя структура называетсяList… Очевидно, что это Person :)

  7. 7
    Алексей Богданов ответил:

    Можно игнорировать символы с помощью ifstream::ignore().

  8. 8
    Дмитрий Гайдамович ответил:

    Ух ты, а я и не знал, что такая есть стандартная. Посмотрел реализацию – она вынимает посимвольно, что немного уменьшает мой позор :)

  9. 9
    Лёшка Пьянзин ответил:

    Можно разбить логически записи по тройкам, притом каждый первый из них выбрасывать, каждый второй в last_name, каждый третий в name.
    Дело за реализацией =)

  10. 10
    Дмитрий Щёголев ответил:

    #10- наиболее естественное поведение для алгоритма) +1

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.