Есть файл с данными:
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;
}
Вопрос: может есть какой-то другой способ игнорировать лишние данные?
6 мая 2008 в 15:04
#10- наиболее естественное поведение для алгоритма) +1
6 мая 2008 в 12:05
Можно разбить логически записи по тройкам, притом каждый первый из них выбрасывать, каждый второй в last_name, каждый третий в name.
Дело за реализацией =)
6 мая 2008 в 10:00
Ух ты, а я и не знал, что такая есть стандартная. Посмотрел реализацию – она вынимает посимвольно, что немного уменьшает мой позор
6 мая 2008 в 6:05
Можно игнорировать символы с помощью ifstream::ignore().
6 мая 2008 в 1:00
>> может есть какой-то другой способ игнорировать лишние данные?
Володя, тебе не нравится tmp, которая никому не нужна? Ну так если использоватьклассы потоков С++ и перегруженные для разных типов операторы >>(), то мы вынуждены "подсунуть" ссылку на переменную интересующего типа: этим мы задаём способ "вычитки" данных для данного типа. Какие могут быть альтернативы? Все они основываются на отказе от использования >>(). Например.
1) Вычитывать посимвольно. Организоватьцикл, где первым оператором будет "взять очередной символ", а дальше – действия в зависимости от того, какой это символ (конструкция switch-case). Конечно, нужно буферизовать. Если я не ошибаюсь, ifstream поддерживает внутренний буфер? Очевидно, что при этом нужно завести переменную для указаниятого, какую часть мы сейчас читаем (имя или фамилию), и куда "складывать" очередной символ, а также обрабатывать конец строки.
2) Вычитывать построчно. Завести буфер для очередной получаемой строчки, в цикле получать заполнять его из файла, и, определяя в полученной строчке, где там границы нужных полей,уже оттуда отправлять всякими strncpy() в нужные места. Это напоминает связку readLine-split в каких-нибудь скриптах, только более производительную, потому что мы не создаём массив строк, как это делает split.
Как 1, так и 2 – более низкоуровневые способы, чем перегруженные >>() и манипуляторы. Их имеет смысл использовать только если не хочешь "тащить" потоки C++, ну, к примеру, для уменьшения размера exe-шника. А так, как у тебя написано, – мне кажется, это наиболее просто и наглядно, несмотря на "лишнюю" tmp.
Только непонятно, почему твоя структура называетсяList… Очевидно, что это Person
5 мая 2008 в 23:05
Спасибо.
5 мая 2008 в 23:02
Не вопрос… пожалуйста.
5 мая 2008 в 22:05
Ничего не имею против украинского языка как такового, но в данном сообществе говорят на русском; не будем отклоняться. Исправь, пожалуйста.
5 мая 2008 в 22:00
[code]
char last_name; // Один символ для прізвища ?
int name;//Ім'я - ціле число ?
[/code]
Вчитись, вчитись і ще раз вчитись….
5 мая 2008 в 22:00
Вже виправив, сорі…