Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 452
от 30.06.2006, 22:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 350, Экспертов: 45
В номере:Вопросов: 2, Ответов: 3


Вопрос № 47248: Здравствуйте, эксперты. У меня такой вопрос: почему при чтении текстового файла на C++ (используя функцию fgets из stdio.h), файл содержащий в своем конце перевод каретки, читается с дублированной последней строкой. Т.е., если есть файл такого содерж...
Вопрос № 47291: Здравствуйте, господа. У меня вопрос по шаблонным типам. Существует шаблонный класс(в приложении его фрагмент), который реализует бинарное дерево. В нём есть метод Add(const T& value) который добавляет в дерево элемент. С числовыми типами всё...

Вопрос № 47.248
Здравствуйте, эксперты. У меня такой вопрос: почему при чтении текстового файла на C++ (используя функцию fgets из stdio.h), файл содержащий в своем конце перевод каретки, читается с дублированной последней строкой. Т.е., если есть файл такого содержания:
-------------------------
1)Первая строка
2)Вторая строка

-------------------------
то возвращается следующее:
-------------------------
1)Первая строка
2)Вторая строка
2)Вторая строка
-------------------------
И еще вопрос: как лучше читать большие текстовые файлы. Я заметил, что если файл читается не построчно, а кусками, которые помещаются в буфер - каждый раз, после помещения порции текста в буфер, последними символоми в буфере являются буква "я" и квадратик. Что бы с этим можно было сделать? Заранее спасибо.
Отправлен: 25.06.2006, 05:24
Вопрос задал: Васильков Вадим (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Red Devil
Здравствуйте, Васильков Вадим!
Все просто как божий день :)
У тебя в файле есть последняя пустая строка, а в буфере в который ты считываешь стркоку из файла сохраняется строка из предыдущей операции считывания, т.е. последней. Необходимо строку очищать от предыдущих результатов. Например, как я это делаю функция clrstr(), смотри в приложении.

В С++ для работы с файлами лучшег всего использовать класс fstream - потоки. Но это в С++, а не в Си.

Приложение:

---------
Есть 10 типов людей: те, кто знаком с двоичной системой, и те, кто нет.

Ответ отправил: Red Devil (статус: Студент)
Ответ отправлен: 25.06.2006, 06:23

Отвечает: Zitz
Здравствуйте, Васильков Вадим!

Функция очистки строки есть в #include
Вот сразу три варианта:
1. _strset(str,0);
2. memset(str,0,size);
3. Просто вместо первого символа 0 поставить, т.е.
str[0] = 0;

Да и вообще вся проблема в том, что последний раз считывается в холостую.
Тут просто не хватает такой проверки:
if ( !fgets(buf, 100, pFile) ) break;
(равносильно if ( fgets(buf, 100, pFile) == NULL ) break; )
Т.е. если функция fgets ничего не вернула, то значит достигли конца файла (в буфер ничего не скидывается и там остается то что было, т.е. предыдущая строка) и больше выводить не нужно, цикл закончим.

Приложение:

---------
Успех неизбежен + Думать вообще полезно + Чем сейчас, тем лучше

Ответ отправил: Zitz (статус: Студент)
Ответ отправлен: 25.06.2006, 11:20
Оценка за ответ: 5


Вопрос № 47.291
Здравствуйте, господа.
У меня вопрос по шаблонным типам.
Существует шаблонный класс(в приложении его фрагмент), который реализует бинарное дерево. В нём есть метод Add(const T& value) который добавляет в дерево элемент. С числовыми типами всё работает прекрасно, но если я хочу работать со строками (тип char*), он не в состоянии расставить их по дереву в правильном порядке (и это неудивительно, т.к. фактически он сравнивает адреса строк друг с другом). Для решения этой проблемы я решил вопользоваться оператором typeid.
Собственно, вопрос: существует ли какой-либо способ определения типа на этапе компилляции, ведь при компилляции тип T и тип передаваемого в функцию Add параметра известны?

Приложение:

Отправлен: 25.06.2006, 22:12
Вопрос задал: X-MAN (статус: 7-ой класс)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: deleted
Здравствуйте, X-MAN!

Может лучше определить операцию сравнения

template < class tTx > bool Less( tTx const& a, tTx const &b ) { return a < b; }

и реализацию для char*

inline bool Less( char const *a, char const *b) { return 0 < strcmp(a,b); }

Вместо '<' пользовать - Less.

Ответ отправил: deleted (статус: 1-ый класс)
Ответ отправлен: 26.06.2006, 02:43
Оценка за ответ: 1
Комментарий оценки:
Я спросил, как определить тип на этапе компилляции, а не как определить операцию сравнения для строк, это я знаю не хуже вас! Читайте вопрос внимательно!!!


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.34 от 01.06.2006
Яндекс Rambler's Top100

В избранное