Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 23.04.2012, 18:39   #1
sawyer1988
Пользователь
 
Регистрация: 21.04.2012
Сообщений: 36
Репутация: 10
По умолчанию Контейнер 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();
}
sawyer1988 вне форума   Ответить с цитированием
Старый 23.04.2012, 19:09   #2
Granus
С++
Участник клуба
 
Аватар для Granus
 
Регистрация: 22.09.2008
Адрес: Санкт-Петербург
Сообщений: 791
Репутация: 115

skype: lisyarus
По умолчанию

в конце цикла считывания добавьте
Код:
if (f.eof()) break;
__________________
Форматируйте код, будьте людьми.
Granus вне форума   Ответить с цитированием
Старый 23.04.2012, 19:13   #3
sawyer1988
Пользователь
 
Регистрация: 21.04.2012
Сообщений: 36
Репутация: 10
По умолчанию

Никаких изменений(

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;
}
sawyer1988 вне форума   Ответить с цитированием
Старый 23.04.2012, 19:22   #4
sawyer1988
Пользователь
 
Регистрация: 21.04.2012
Сообщений: 36
Репутация: 10
По умолчанию

Вот так всё норм Благодарю!! Тока объясните,если несложно почему без
проверки не работало?

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;

}
sawyer1988 вне форума   Ответить с цитированием
Старый 23.04.2012, 21:25   #5
Granus
С++
Участник клуба
 
Аватар для Granus
 
Регистрация: 22.09.2008
Адрес: Санкт-Петербург
Сообщений: 791
Репутация: 115

skype: lisyarus
По умолчанию

честно говоря, сам не очень понимаю, почему так)
__________________
Форматируйте код, будьте людьми.
Granus вне форума   Ответить с цитированием
Старый 25.04.2012, 01:27   #6
Д_М
Форумчанин
 
Регистрация: 02.02.2011
Адрес: Москва
Сообщений: 92
Репутация: 10
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
честно говоря, сам не очень понимаю, почему так)
Очень просто - флаг eof выставляется после первой попытки чтения за концом файла.

Прочитали последнюю строку - f.eof() все еще false.
Попытались читать дальше - f.eof() вернул true.
Отсюда лишняя итерация цикла.

Вообще я бы этот цикл написал так:

string s;
fstream f("test.txt");
while(getline(f, s)) { .... }
Д_М вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Открывается пустой лист, но не пустой, а смещенный вверх 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 11:25


04:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.