| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Файловый I/O |
| Автор: OXOTHUK 29.12.2005, 15:39 |
| Люди у меня через неделю городская олимпиада. Раньше я писал на Паскале, но перешёл на C++. Там требуют читать из файла данные и записывать ответ. Я на си могу только записывать и только через fstream. Читать не получается. Например надо прочитать: 2 3 5 АБВ Числа 2, 3, 5 записать в 3 int`а, а строку в char*. Я что-то выдел, что можно через FILE, но не знаю как работает. В паскале там всё просто с этим, мне надо так, чтобы не писать огромных функций по чтению. Help, plz. |
| Автор: Exekutor 29.12.2005, 15:42 |
| функции scanf и др. тебе в помощь |
| Автор: Void 29.12.2005, 15:52 | ||
Ну fstream, так fstream:
|
| Автор: TheBoss 29.12.2005, 16:08 | ||
|
| Автор: OXOTHUK 30.12.2005, 15:43 | ||
| TheBoss Что-то не совсем понял код. Объявить - объявил файл, но ни адреса, ни открытия. Void Ну ввёл я в прогу:
Создал файл на диске D: под именем 1.txt, ввёл туда: 2 3 5 ABC Запустил прогу и смотрю результат: 0 0 0 Т. е. 3 нуля и пустая строка, т. е. ничего не прочиталось. Именно из-за этого и у меня не получалось. А строки не согу, т. к. у меня Turbo C++ 3.0 и там видимо устаревший стандарт С\С++: там нету bool и true/false(вместо них int и 1/0). Также я не нашёл string`а. |
| Автор: dronzo 30.12.2005, 16:59 | ||
OXOTHUK
Dev-C++ по крайней мере съел. |
| Автор: Void 30.12.2005, 17:59 | ||
| OXOTHUK У тебя просто файл не открылся. Бэкслэш надо писать двойной.
Рискуем нарваться на buffer overrun. Лучше пользоваться istream::getline, раз уж у нас нет std::string. |
| Автор: blackofe 30.12.2005, 21:59 | ||
поправьте меня, если я не прав. но, имхо, bool есть в с++ с самой первой редакции (у меня нет страуструпа первой редакции, но во второй bool точно есть). а вот string, да, появился только в третьей редакции. поскольку во второй редакции страуструп ввел шаблоны, а степанов этим воспользовался, создав STL. |
| Автор: LPBOY 30.12.2005, 22:26 | ||||||
Не читал первую редакцию, но вот что дал поиск: http://www.intuit.ru/department/se/pbmsu/8/3.html
В BC++3.0 можно сделать так:
Все же, чем int и 0/1, несколько лучше имхо. |
| Автор: OXOTHUK 1.1.2006, 08:57 | ||
Void
Это как? P.S. ничего не знаю, но bool мне надо вручную вводить и его готового там нет. |
| Автор: LPBOY 1.1.2006, 10:57 | ||
Очень просто: D:\\1.txt |
| Автор: nikitao 1.1.2006, 23:22 | ||
| OXOTHUK Бэкслэш надо писать двойной потому что компилятор думает что следующий за ним символ вместе с ним образуют специальный символ(к примеру '\n')Представь такое имя файла
Такое имя привело бы к неверной работе. Но в С++ '\\'=='\' в обычной жизни (это тоже специальная комбинация. |
| Автор: OXOTHUK 2.1.2006, 15:02 |
| Извиняюсь, совсем забыл. Не привык я так писать (долбанный паскаль). Заработало(прочитал), но строку всё равно не хочет - пустая выводится. |
| Автор: dronzo 2.1.2006, 15:49 |
| OXOTHUK, Правильно я же тебе сказал - замени fin.getline() на fin >> (про overrun читал |
| Автор: nikitao 2.1.2006, 16:48 | ||||
| dronzo,твое предложение не есть good еще по одной причине(помимо той что сказаал Void): Возьмем такой файл: 239 30 566 Hello world Очевидно,что нам нужно,чтобы в строке оказалось Hello world,а разумеется окажется Hello .Это проблему ессно решает getline. OXOTHUK Если не понял обьяню более наглядно.На самом деле файл который я написал выше представляет вид ,что-то типа этого: 239\n 30\n 566\n Hello world Оператор >> по умолчанию пропускает все знаки разделители ,затем записывает в указаную переменную данный до следующего знака разделителя или до "знака другого типа"(к примеру если строка 12345Vingrad ,то после fin>>a,окажется в a 12345). Получается что после строки в коде
Файловый указатель указывает на последний '\n' В свою очередь getline работает по другому:Она ничего не пропускает,но символы типа '\n' являются для нее указанием ,что это конец строки.Таковым оказывается 1 считаный ей символ=>str остается пустым.В результате всего надо просто ввести "темповый" символ.
|
| Автор: dronzo 2.1.2006, 17:00 |
| nikitao Да, это я немного на примере застопорился |
| Автор: OXOTHUK 3.1.2006, 13:12 | ||||||
| Я так поэкспериментировал и понял, что: 1) После чтения чисел fin.getline(str, 256); надо писать 2 раза(не занимать память всякими темповыми, а просто 2 раза). 2) После чтения строки можно(и нужно) и один раз. А вот дана строка и надо почитать слова в разные строки. Это значит надо:
Например: есть файл 1.txt: ABC DEF GHI Прога:
Получается - он прочитал: ABCDEF (а где GHI?) Я следал:
Тогда он всё напечатал: ABCDEFGHI Почему он не прочитал третье слово? |
| Автор: Void 3.1.2006, 13:18 | ||
Куда по-твоему читатются строки из файла? Под str1, str2, str3 не выделена память и они указывают неизвестно куда. Если же это просто опечатка, и память ты на самом деле выделял - что ж, есть единственный способ избавиться от этих проблем: выбросить Turbo C++ в топку, и взять нормальный компилятор. |