|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.04.2012, 18:39 | #1 |
Пользователь
Регистрация: 21.04.2012
Сообщений: 36
|
Контейнер vector добавляет пустой элемент
Добрый день.Помогите найти ошибку в main.
В текстовом файле 3 строки. Эти строки сначала читаются в объекты,затем объекты в вектор. Всё ок, только вектор добавляет на один элемент больше,чем в файле. #include <iostream> #include <fstream> #include <vector> using namespace std; class base{ public: char*str; char*st; public: base(){str[0]='\n';} base(char* s,char*p) { str=new char[20]; st=new char[20]; strcpy(str,s); strcpy(st,p); } ~base(){ delete[]str; delete[]st; } base(const base &o){ str=new char[20]; strcpy(str,o.str); st=new char[20]; strcpy(st,o.st); } friend ostream &operator<<(ostream &stream, base &ob) { stream<<ob.str<<" "<<ob.st<<endl; return stream; } friend istream &operator>>(istream &stream, base &ob) { stream>>ob.str>>ob.st; return stream; } }; void main(void) { vector<base>v; char *o=new char[20]; char *i=new char[20]; fstream f("test.txt"); while(!f.eof()) { cout<<"tec razmer "<<v.size()<<endl; f.getline(o,20); f.getline(i,20); base ob1(o,i); v.push_back(ob1); } cout<<"nov razmer vectora: "<<v.size()<<endl; //на экране 4,в файле 3 //строки cout<<"spisok:"<<endl; for(int i=0;i<v.size();i++) //выводится 3 строки,но размер у вектора 4 cout<<v[i]<<endl; getchar(); getchar(); } |
23.04.2012, 19:09 | #2 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
в конце цикла считывания добавьте
Код:
Форматируйте код, будьте людьми.
|
23.04.2012, 19:13 | #3 |
Пользователь
Регистрация: 21.04.2012
Сообщений: 36
|
Никаких изменений(
while(!f.eof()) { cout<<"tec razmer "<<v.size()<<endl; f.getline(o,20); f.getline(i,20); base ob1(o,i); v.push_back(ob1); cout<<ob1<<endl; if (f.eof()) break; } |
23.04.2012, 19:22 | #4 |
Пользователь
Регистрация: 21.04.2012
Сообщений: 36
|
Вот так всё норм Благодарю!! Тока объясните,если несложно почему без
проверки не работало? while(!f.eof()) { f.getline(o,20); f.getline(i,20); base ob1(o,i); if(f.eof())break; v.push_back(ob1); cout<<ob1<<endl; cout<<"tec razmer "<<v.size()<<endl; } |
23.04.2012, 21:25 | #5 |
С++
Форумчанин
Регистрация: 22.09.2008
Сообщений: 791
|
честно говоря, сам не очень понимаю, почему так)
Форматируйте код, будьте людьми.
|
25.04.2012, 01:27 | #6 |
Пользователь
Регистрация: 02.02.2011
Сообщений: 92
|
Очень просто - флаг eof выставляется после первой попытки чтения за концом файла.
Прочитали последнюю строку - f.eof() все еще false. Попытались читать дальше - f.eof() вернул true. Отсюда лишняя итерация цикла. Вообще я бы этот цикл написал так: string s; fstream f("test.txt"); while(getline(f, s)) { .... } |
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Открывается пустой лист, но не пустой, а смещенный вверх | romamania | Microsoft Office Excel | 3 | 31.05.2012 15:28 |
Ссылка на контейнер из ссылки на элемент. | the_deer_one | WPF, UWP, WinRT, XAML | 1 | 29.08.2011 16:13 |
Определить пустой ли элемент в массиве | NeVerSS | Общие вопросы Delphi | 4 | 17.05.2010 13:01 |
PHP. Не добавляет запись | Студло | Помощь студентам | 12 | 26.03.2010 10:25 |