Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2012, 23:47   #1
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию Файлы и потоки.Ошибка

Есть файл, с которого считывается информация
например:

1 car2
2 car1
3 car3

и выводится на экран в консоли.
Я написала вот:
Код:
ifstream in("winHist.txt",ios::in|ios::binar y);
 int place;
 char name[10];
 char str[80];
 char ch;
 if(!in){
 cout<<"Pomylka.\n";
 return 1;
 }
 while(in!=NULL){

 in>>place;
 in>>name;
 in>>ch;
 cout<<place<<" "<<name<<"\n";


 }
но в результате выводится:
1 car2
2 car1
3 car3
3 car3


Я не понимаю почему так, но думаю, что как-то связано с символом конца строки...Подскажите где ошибка, пожалуйста.

Последний раз редактировалось ACE Valery; 23.03.2012 в 11:46.
akademochka вне форума Ответить с цитированием
Старый 23.03.2012, 00:12   #2
GraF_DOS
 
Регистрация: 22.03.2012
Сообщений: 4
По умолчанию

а разве конец строк не endl??? Или разницы нет=))
В этом мире мы всего лишь маленькие биты вселенной, кто то полные 0-ли а кого-то 1-цы! (с)
GraF_DOS вне форума Ответить с цитированием
Старый 23.03.2012, 00:40   #3
treis1000
Пользователь
 
Аватар для treis1000
 
Регистрация: 16.03.2012
Сообщений: 27
По умолчанию

\n это от СИ, а endl от плюсов насколько я помню.
Кто владеет информацией, тот владеет миром!
treis1000 вне форума Ответить с цитированием
Старый 23.03.2012, 08:54   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от treis1000 Посмотреть сообщение
\n это от СИ, а endl от плюсов насколько я помню.
'\n' символ перевода каретки на начало новой строки.
Может быть использован везде, где используются символы.

endl - указатель на функцию, которая определена примерно так:

Код:
	// MANIPULATORS
template<class _Elem,
	class _Traits> inline
	basic_ostream<_Elem, _Traits>&
		__CLRCALL_OR_CDECL endl(basic_ostream<_Elem, _Traits>& _Ostr)
	{	// insert newline and flush stream
	_Ostr.put(_Ostr.widen('\n'));
	_Ostr.flush();
	return (_Ostr);
	}
Как видишь, данный манипулятор тупо закидывает в поток опять таки - тот же самый символ '\n'

Таким образом нет никакой принципиальной разницы:
Код:
std::cout << '\n';
или
Код:
std::cout<< endl;
Хотя без оптимизаций компилятора, первый способ отработает быстрее.
_Bers вне форума Ответить с цитированием
Старый 23.03.2012, 09:54   #5
reserv
Пользователь
 
Регистрация: 17.02.2012
Сообщений: 10
По умолчанию

По-моему, нужно проверять в цикле while не
Код:
in != NULL
, а
Код:
!in.eof()
- признак конца файла.
reserv вне форума Ответить с цитированием
Старый 23.03.2012, 11:26   #6
Karmadon
Пользователь
 
Аватар для Karmadon
 
Регистрация: 28.02.2012
Сообщений: 46
По умолчанию

Лишняя итерация вроде
а почему while(in!=NULL) может while(in) ?
или корявый while (in>>place && in>>name && in>>ch)

А точно в двоичном нужно вам открывать?
там же просто строчки..
"THE ONLY WAY TO GET SMARTER IS BY PLAYING A SMARTER OPPONENT." -- Fundamentals of Chess 1883

Последний раз редактировалось Karmadon; 23.03.2012 в 11:28.
Karmadon вне форума Ответить с цитированием
Старый 23.03.2012, 17:24   #7
akademochka
Пользователь
 
Регистрация: 06.11.2011
Сообщений: 44
По умолчанию

Спасибо большое! так работает, но я пробовала вчера, почему-то не вышло...
А сегодня работает)))

Последний раз редактировалось akademochka; 23.03.2012 в 17:27.
akademochka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
файлы и потоки N1b1V Общие вопросы Delphi 0 23.02.2011 16:27
Потоки и файлы mazak Общие вопросы C/C++ 2 28.07.2009 18:23
Builder C++ бинарные потоки,файлы Yakushov C++ Builder 1 21.12.2008 11:55