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

Поиск:

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


Архимед
****


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

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



Цитата(Alek86 @  1.12.2007,  21:34 Найти цитируемый пост)
именно НЕ там, где должен лежать...
Кстати, вполне возможно, что это и есть разгадка аномалий с потоками, наблюдаемых топикстартером smile.


Цитата(Alek86 @  1.12.2007,  21:34 Найти цитируемый пост)
а говорил, экстрасенсов нету...

Стараюсь smile.


--------------------
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, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Dims, проверь is_open'ом


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


Эксперт
***


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

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



Цитата(archimed7592 @  1.12.2007,  12:48 Найти цитируемый пост)
Dims, интересно получается - при выводе ты указываешь, что нужно вставлять разделитель в виде запятой, и при вводе хочешь, чтобы поток сам догадался? 

Естественно, нет smile
Но должен же быть способ ему сказать, что я хочу?
Я думал, что операция cin >> v должна выбирать из потока целое число (если long v) и останавливаться тогда, когда символ не является цифрой (точнее, когда его невозможно уже считать частью числа). Судя по всему, у других так и работает.

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


Архимед
****


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

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



Цитата(Dims @  2.12.2007,  16:21 Найти цитируемый пост)
Судя по всему, у других так и работает.

Так и есть. Можешь сам попробовать сделать так:
Код

#include <istream>
#include <ostream>
#include <iostream>
#include <fstream>
int main()
{
    ifstream fin("test.txt"); // в файлике должно быть что-то вроде "123,456"(без кавычек :) )
    if (!fin)
    {
        std::cerr << "oops";
        return -1;
    }
    char c;
    int i1, i2;
    fin >> i1 >> c >> i2;
    std::cout << i1 << c << i2 << std::endl;
}



--------------------
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   Вверх
Dims
Дата 4.12.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



У меня получилось вот что

Код

-858993460╠-858993460
Для продолжения нажмите любую клавишу . . .


Видимо, после первой попытки прочитать число, поток переходит в состояние ошибки, при этом ни первое, ни последующие извлечения не производятся (в переменных остаётся мусор).

Это что же, Вижуал Студио так работает неправильно? А где-то написано, что она должна работать иначе?

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


Архимед
****


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

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



Dims, ага, написано... В том самом талмуде, который я тебе не так давно отправлял smile.


Цитата(Dims @  4.12.2007,  11:36 Найти цитируемый пост)
У меня получилось вот что

У меня получается то же самое, в случае, если удалить файл 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
PM Jabber   Вверх
Random13
Дата 4.12.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

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



Не знаю точно о разделителе, но настройки стрима по умолчанию можно менять, например
ostream << setprecision(2) << setfill(*) << setw(6) << 4.17;
выведет
***4.2
нужно поискать остальные в хэлпе

Это сообщение отредактировал(а) Random13 - 4.12.2007, 19:02
PM MAIL   Вверх
bsa
Дата 4.12.2007, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Random13, какое отношение это имеет к теме топика?  smile 

Это сообщение отредактировал(а) bsa - 4.12.2007, 18:18
PM   Вверх
Random13
Дата 4.12.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 116
Регистрация: 21.11.2007

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



Цитата(bsa @ 4.12.2007,  18:17)
Random13, какое отношение это имеет к теме топика?  smile

Человек вместо пробелов хочет запятую разделителем сделать по умолчанию - ну это одна из проблем - как я понял.

Это сообщение отредактировал(а) Random13 - 4.12.2007, 18:22
PM MAIL   Вверх
Dims
Дата 4.12.2007, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(archimed7592 @  4.12.2007,  17:41 Найти цитируемый пост)
У меня получается то же самое, в случае, если удалить файл test.txt(или убрать его куда-нибудь).

Это отдельный вопрос: почему в этом случае не срабатывает 

Код

if (!fin)

?

Чтобы не гадать, где должен лежать файл, я написал так

Код

    ofstream fout("testik.txt");
    if (!fout)
    {
        std::cerr << "oops";
        return -1;
    }
    fout << 123 << "," << 456;
    fout.close();

    ifstream fin("testik.txt"); // в файлике должно быть что-то вроде "123,456"(без кавычек :) )
    if (!fin)
    {
        std::cerr << "oops";
        return -1;
    }
    char c;
    int i1, i2;
    fin >> i1 >> c >> i2;
    std::cout << i1 << c << i2 << std::endl;
    system("pause");


И получил тот же результат (мусор).

Добавлено через 41 секунду
P.S. При этом текстовый файл образовался, где я и предполагал.
PM MAIL   Вверх
archimed7592
Дата 4.12.2007, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 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
PM Jabber   Вверх
Dims
Дата 4.12.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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 секунды
Причём кажется, мне что я когда рылся в документации, где-то видел типа, что так и должно быть.
PM MAIL   Вверх
archimed7592
Дата 4.12.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



Цитата(Dims @  4.12.2007,  19:59 Найти цитируемый пост)
Ведь !fin должно быть истинно, когда с потоком что-то не так.

Дык у тебя же с ним всё в порядке...


Цитата(Dims @  4.12.2007,  19:59 Найти цитируемый пост)
Microsoft Visual Studio 2005
Version 8.0.50727.42  (RTM.050727-4200)
Microsoft .NET Framework
Version 2.0.50727

Ты точно что-то не так делаешь... Я тоже на восьмой проверял. Сомневаюсь, что это из-за сервис-пака. Завтра ещё на работе проверю - там у меня без сервис-пака.


--------------------
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   Вверх
Dims
Дата 5.12.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



А ты предположи, что может быть не так? В последней программе файла не может не быть, ведь он создаётся из самой программы. 

Я так понял, такой глюк не только у меня. Может быть, в каких-то настройках компиллятора можно задавать разделитель, хоть это и странно?
PM MAIL   Вверх
baldina
Дата 6.12.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 32
Всего: 101



попробуй:

Код

  ifstream file;
  long v;

  file.open(filename);
  while (file >> v)
  {
    cout << v << endl;
    char c;
    file >> c;
  }

  file.close ();


а разделитель задать нельзя. т.е. потоки умеют глотать пробельные символы; является ли символ пробельным определяется локалью. в принципе можно создать локаль, объявив запятую пробельным символом, но мне кажется это чересчур сложно для такой простой задачи.

Добавлено через 3 минуты и 47 секунд
> И получил тот же результат (мусор).

Вообщето код этот не только выглядит работающим, но и работает  smile 
VS 2003
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.0565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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