Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чё-то не пойму, как прочесть целое число из файла? 
:(
    Опции темы
Dims
Дата 30.11.2007, 21:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А operator>> считывает целые числа в текстовом виде или как?

вот такой у меня код:
Код

ifstream file;
long v;

file.open( filename );
file >> v;


вот такой у меня файл (текстовый):

1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,2,1,3,36546396
и так далее.

Смотрю в отладчике -- в v попадает какой-то бред (большое отрицательное число). Причём, поток переходит в состояние ошибки.

Почему? Наверное, он в двоичном формате считывает? А как сделать в текстовом?

Почему 

cout << v;

выводит в текстовом?

PM MAIL   Вверх
Dims
Дата 30.11.2007, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Ха!

Решил переопределить operator>> для long...

Не тут-то было! Не даёт, дура. Говорит ambigous...

Чё делать-то???
PM MAIL   Вверх
Alek86
Дата 30.11.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



ifstream сам не может догадаться, что у тебя делимитер ","
можно пробел использовать или энтер


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dims
Дата 30.11.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



М-дя, кажется, это заговор. Зря я с этими istream-ами связался. Надо было писать по-старинке.

Написал функцию long readlong( istream &is ), которая читает посимвольно и составляет число.

Так оказалось, что при чтении пропускаются символы перевода строки!

Сейчас для меня это выглядит так, словно всё специально сделано так, чтобы пользоваться потоками было невозможно.

Спрашивается, где логика?

Почему оператор 

Код

long v = 12;
cout << v; 


выводит переменную в текстовом виде, а оператор

Код

long v;
cin << v; 


считывает её в двоичном?

Ну ладно, любим очень двоичные данные. Но нафига тогда съедать символы перевода строки? Ведь в двоичном виде эти символы могут быть нужны! 

То есть, получается, istream -- это особый способ читать двоичные файлы с проглатыванием некоторых байтов!?

Или я чего-то по-крупному не понимаю? smile

Добавлено через 2 минуты и 1 секунду
Цитата(Alek86 @  30.11.2007,  22:43 Найти цитируемый пост)
ifstream сам не может догадаться, что у тебя делимитер ","

Сам не может, а с моей помощью -- может? Как ему подсказать? Как ему сказать, чтобы он делал то, что надо, а не то, что ему в голову взбредёт? Формат файла у меня задан.

Добавлено через 4 минуты и 33 секунды
А, то есть, он, всё-таки, читает в текстовом виде, но спотыкается на запятой?

А что мне делать, чтоб (1) не спотыкался и (2) видел концы строк?
PM MAIL   Вверх
archimed7592
Дата 30.11.2007, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Dims @  30.11.2007,  22:43 Найти цитируемый пост)
считывает её в двоичном?

Если изменить направление стрелок, то считывать будет в текстовом виде.

Цитата(Dims @  30.11.2007,  22:43 Найти цитируемый пост)
Или я чего-то по-крупному не понимаю? smile 

По всей видимости, что да, только я из 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
PM Jabber   Вверх
Alek86
Дата 30.11.2007, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



getline, кажись, делимитеры принимает


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dims
Дата 30.11.2007, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Цитата(archimed7592 @  30.11.2007,  22:55 Найти цитируемый пост)
По всей видимости, что да, только я из 3-х твоих постов так и не понял ни того, что ты хочешь от потоков получить, ни в чём суть твоей проблемы. 

Ну как мне с помощью потоков прочитать файл, который представляет собой записанные в текстовом виде целые числа через запятую?

А как это стрелочки в другую сторону? Я так понимаю, что если влево, то это вывод, а если вправо, то ввод. Не так?

PM MAIL   Вверх
Alek86
Дата 1.12.2007, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Код

long v;
cin << v;


архимед имел в виду, что ты тут неправильно стрелки поставил


--------------------
user posted image    user posted image
PM MAIL   Вверх
Dims
Дата 1.12.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



А, да, я перепутал.

Я, собственно, уже прочёл построчно файл, с разбором каждой строки. Но это как-то некрасиво. 

Где же поточные прелести?
PM MAIL   Вверх
maxim1000
Дата 1.12.2007, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



в принципе, можно всё прочитать в строку, заменить все запятые на пробелы, потом из неё сделать std::istringstream и из него читать обычным operator>>


--------------------
qqq
PM WWW   Вверх
Dims
Дата 1.12.2007, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: 1
Всего: 11



Всё равно как-то это некрасиво. Я же могу с лёгкостью сделать вывод через запятую. Почему же обратная операция порождает такие глюки?
PM MAIL   Вверх
bsa
Дата 1.12.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



test.cpp:
Код
#include <iostream>
#include <fstream>
int main()
{
        std::ifstream file("test.txt");
        long v;
        file >> v;
        std::cout << v << std::endl;
        return 0;
}
test.txt:
Код
1234,1002
Результат работы:
Код
$ ./test 
1234
Компилировал с помощью GCC 4.1.2
PM   Вверх
Alek86
Дата 1.12.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



на VS 2005 ни дебаг ни релиз такого результата не дают


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 1.12.2007, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Dims, интересно получается - при выводе ты указываешь, что нужно вставлять разделитель в виде запятой, и при вводе хочешь, чтобы поток сам догадался? smile

Попробуй указать ему, что между числами есть разделитель:
Код

#include <istream>
#include <ostream>
#include <iostream>

int main()
{
    char c;
    int i1, i2;
    std::cin >> i1 >> c >> i2;
    std::cout << i1 << c << i2 << std::endl;
}


Что же касается конвертации \r\n в \n - это особенность текстовых потоков. Если хочешь работать с потоком в бинарном режиме, то используй соответствующие методы, а не операторы <<, >>.

Ах, ну да, то что поток сам догадывается, что нужно пропускать пробельные символы - это только лишь по умолчанию:
Код

#include <iomanip>
// ...
std::cin >> std::noskipws;


Добавлено через 8 минут и 43 секунды
Цитата(Alek86 @  1.12.2007,  12:34 Найти цитируемый пост)
на VS 2005 ни дебаг ни релиз такого результата не дают 

Выкини свою студию - она у тебя пиратская smile.
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
PM Jabber   Вверх
Alek86
Дата 1.12.2007, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(archimed7592 @  1.12.2007,  12:48 Найти цитируемый пост)
Выкини свою студию - она у тебя пиратская 

каюсь, но выкидывать не буду
Цитата(archimed7592 @  1.12.2007,  12:48 Найти цитируемый пост)
Hint: файлик test.txt где лежит?

именно НЕ там, где должен лежать...
а говорил, экстрасенсов нету...




--------------------
user posted image    user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2890 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.