![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
А operator>> считывает целые числа в текстовом виде или как?
вот такой у меня код:
вот такой у меня файл (текстовый): 1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,2,1,3,36546396 и так далее. Смотрю в отладчике -- в v попадает какой-то бред (большое отрицательное число). Причём, поток переходит в состояние ошибки. Почему? Наверное, он в двоичном формате считывает? А как сделать в текстовом? Почему cout << v; выводит в текстовом? |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Ха!
Решил переопределить operator>> для long... Не тут-то было! Не даёт, дура. Говорит ambigous... Чё делать-то??? |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ifstream сам не может догадаться, что у тебя делимитер ","
можно пробел использовать или энтер |
|||
|
||||
| Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
М-дя, кажется, это заговор. Зря я с этими istream-ами связался. Надо было писать по-старинке.
Написал функцию long readlong( istream &is ), которая читает посимвольно и составляет число. Так оказалось, что при чтении пропускаются символы перевода строки! Сейчас для меня это выглядит так, словно всё специально сделано так, чтобы пользоваться потоками было невозможно. Спрашивается, где логика? Почему оператор
выводит переменную в текстовом виде, а оператор
считывает её в двоичном? Ну ладно, любим очень двоичные данные. Но нафига тогда съедать символы перевода строки? Ведь в двоичном виде эти символы могут быть нужны! То есть, получается, istream -- это особый способ читать двоичные файлы с проглатыванием некоторых байтов!? Или я чего-то по-крупному не понимаю? Добавлено через 2 минуты и 1 секунду Сам не может, а с моей помощью -- может? Как ему подсказать? Как ему сказать, чтобы он делал то, что надо, а не то, что ему в голову взбредёт? Формат файла у меня задан. Добавлено через 4 минуты и 33 секунды А, то есть, он, всё-таки, читает в текстовом виде, но спотыкается на запятой? А что мне делать, чтоб (1) не спотыкался и (2) видел концы строк? |
||||
|
|||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Если изменить направление стрелок, то считывать будет в текстовом виде. По всей видимости, что да, только я из 3-х твоих постов так и не понял ни того, что ты хочешь от потоков получить, ни в чём суть твоей проблемы. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
getline, кажись, делимитеры принимает
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Ну как мне с помощью потоков прочитать файл, который представляет собой записанные в текстовом виде целые числа через запятую? А как это стрелочки в другую сторону? Я так понимаю, что если влево, то это вывод, а если вправо, то ввод. Не так? |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
архимед имел в виду, что ты тут неправильно стрелки поставил |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
А, да, я перепутал.
Я, собственно, уже прочёл построчно файл, с разбором каждой строки. Но это как-то некрасиво. Где же поточные прелести? |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
в принципе, можно всё прочитать в строку, заменить все запятые на пробелы, потом из неё сделать std::istringstream и из него читать обычным operator>>
-------------------- qqq |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Всё равно как-то это некрасиво. Я же могу с лёгкостью сделать вывод через запятую. Почему же обратная операция порождает такие глюки?
|
|||
|
||||
| bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
test.cpp:
|
||||||
|
|||||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
на VS 2005 ни дебаг ни релиз такого результата не дают
|
|||
|
||||
| archimed7592 |
|
||||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Dims, интересно получается - при выводе ты указываешь, что нужно вставлять разделитель в виде запятой, и при вводе хочешь, чтобы поток сам догадался?
Попробуй указать ему, что между числами есть разделитель:
Что же касается конвертации \r\n в \n - это особенность текстовых потоков. Если хочешь работать с потоком в бинарном режиме, то используй соответствующие методы, а не операторы <<, >>. Ах, ну да, то что поток сам догадывается, что нужно пропускать пробельные символы - это только лишь по умолчанию:
Добавлено через 8 минут и 43 секунды Выкини свою студию - она у тебя пиратская Hint: файлик test.txt где лежит? Это сообщение отредактировал(а) archimed7592 - 1.12.2007, 12:50 -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
||||
|
|||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
каюсь, но выкидывать не буду именно НЕ там, где должен лежать... а говорил, экстрасенсов нету... |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Кстати, вполне возможно, что это и есть разгадка аномалий с потоками, наблюдаемых топикстартером
Стараюсь -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
Dims, проверь is_open'ом
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Естественно, нет Но должен же быть способ ему сказать, что я хочу? Я думал, что операция cin >> v должна выбирать из потока целое число (если long v) и останавливаться тогда, когда символ не является цифрой (точнее, когда его невозможно уже считать частью числа). Судя по всему, у других так и работает. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Так и есть. Можешь сам попробовать сделать так:
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
У меня получилось вот что
Видимо, после первой попытки прочитать число, поток переходит в состояние ошибки, при этом ни первое, ни последующие извлечения не производятся (в переменных остаётся мусор). Это что же, Вижуал Студио так работает неправильно? А где-то написано, что она должна работать иначе? |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Dims, ага, написано... В том самом талмуде, который я тебе не так давно отправлял
У меня получается то же самое, в случае, если удалить файл test.txt(или убрать его куда-нибудь). Проверено на студии и мной и Алеком 86-го года рождения. Видимо, что-то ты делаешь не так... -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Random13 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Не знаю точно о разделителе, но настройки стрима по умолчанию можно менять, например
ostream << setprecision(2) << setfill(*) << setw(6) << 4.17; выведет ***4.2 нужно поискать остальные в хэлпе Это сообщение отредактировал(а) Random13 - 4.12.2007, 19:02 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Random13, какое отношение это имеет к теме топика?
Это сообщение отредактировал(а) bsa - 4.12.2007, 18:18 |
|||
|
||||
| Random13 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 21.11.2007 Репутация: нет Всего: нет |
Человек вместо пробелов хочет запятую разделителем сделать по умолчанию - ну это одна из проблем - как я понял. Это сообщение отредактировал(а) Random13 - 4.12.2007, 18:22 |
|||
|
||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Это отдельный вопрос: почему в этом случае не срабатывает
? Чтобы не гадать, где должен лежать файл, я написал так
И получил тот же результат (мусор). Добавлено через 41 секунду P.S. При этом текстовый файл образовался, где я и предполагал. |
||||||
|
|||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Мда... MSVC-?.?
-------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Microsoft Visual Studio 2005
Version 8.0.50727.42 (RTM.050727-4200) Microsoft .NET Framework Version 2.0.50727 А почему у тебя oops не выводится? Ведь !fin должно быть истинно, когда с потоком что-то не так. Следовательно, если файл не существует, то исполнение должно идти в эту ветку. Нет? Добавлено через 32 секунды Причём кажется, мне что я когда рылся в документации, где-то видел типа, что так и должно быть. |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Дык у тебя же с ним всё в порядке...
Ты точно что-то не так делаешь... Я тоже на восьмой проверял. Сомневаюсь, что это из-за сервис-пака. Завтра ещё на работе проверю - там у меня без сервис-пака. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
А ты предположи, что может быть не так? В последней программе файла не может не быть, ведь он создаётся из самой программы.
Я так понял, такой глюк не только у меня. Может быть, в каких-то настройках компиллятора можно задавать разделитель, хоть это и странно? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
попробуй:
а разделитель задать нельзя. т.е. потоки умеют глотать пробельные символы; является ли символ пробельным определяется локалью. в принципе можно создать локаль, объявив запятую пробельным символом, но мне кажется это чересчур сложно для такой простой задачи. Добавлено через 3 минуты и 47 секунд > И получил тот же результат (мусор). Вообщето код этот не только выглядит работающим, но и работает VS 2003 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |