Вопрос № 47248: Здравствуйте, эксперты. У меня такой вопрос: почему при чтении текстового файла
на C++ (используя функцию fgets из stdio.h), файл содержащий в своем конце перевод каретки, читается с дублированной последней
строкой. Т.е., если есть файл такого содерж...Вопрос № 47291: Здравствуйте,
господа.
У меня вопрос по шаблонным типам.
Существует шаблонный класс(в приложении его фрагмент), который реализует бинарное дерево. В нём есть метод Add(const T& value)
который добавляет в дерево элемент. С числовыми типами всё...
Вопрос № 47.248
Здравствуйте, эксперты. У меня такой вопрос: почему при чтении текстового файла на C++ (используя функцию fgets из stdio.h),
файл содержащий в своем конце перевод каретки, читается с дублированной последней строкой. Т.е., если есть файл такого содержания:
-------------------------
1)Первая строка
2)Вторая строка
-------------------------
то возвращается следующее:
-------------------------
1)Первая строка
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; }
Ответ отправил: deleted (статус:
1-ый класс)
Ответ отправлен: 26.06.2006, 02:43 Оценка за ответ: 1 Комментарий оценки: Я
спросил, как определить тип на этапе компилляции, а не как определить операцию сравнения для строк, это я знаю не хуже вас!
Читайте вопрос внимательно!!!