2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 11:37 
Аватара пользователя


01/05/10
126
Есть класс
Код:
class Point{
    friend ostream& operator<<(ostream&, Point p);
    friend istream& operator>>(istream&, Point &p);
   .......
};

с переопределенными (перегруженными) оператрами ввода и вывода. Все работает:
Код:
Point p;
cin >> p;

Но теперь мне нужно читать значения не из консоли, а из файла. Как это сделать, не меняя класс? Чтение строки line из файла с дальнейшим
Код:
line >> p;
не работает:
Код:
    char filename[100];
    cin >> filename;
    ifstream myfile(filename);
    string line;
    istream *is;
    if (myfile.is_open()) getline (myfile,line);
    line >> p;

Я понимаю, что оператор перегружен для потока, а я пытаюсь скромить ему строку, но как ему строку дать в виде потока?

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 11:44 
Заслуженный участник
Аватара пользователя


06/10/08
5956
Зачем, если у Вас уже есть поток myfile?

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 12:50 
Аватара пользователя


01/05/10
126
Xaositect в сообщении #1291971 писал(а):
Зачем, если у Вас уже есть поток myfile?

Мне нужно из каждой строки читать два числа. Это можно сделать, не разбивая файл на строки? Одним потоком?

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 13:10 
Заслуженный участник


31/12/05
1050
Если в каждой строке много чисел, а считать надо только первые два, то не разбивая читать сложно. Вашу задачу решает istringstream.

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 13:41 


26/05/14
566
Kornelij в сообщении #1291980 писал(а):
Xaositect в сообщении #1291971 писал(а):
Зачем, если у Вас уже есть поток myfile?

Мне нужно из каждой строки читать два числа. Это можно сделать, не разбивая файл на строки? Одним потоком?

Да, можно. Просто читайте точки из потока myfile. Разбиение на строки не играет роли.

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение12.02.2018, 16:14 
Заслуженный участник
Аватара пользователя


30/01/06
63952
stringstream

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение15.02.2018, 19:24 
Аватара пользователя


01/05/10
126
Скажите, а если у меня
Код:
class Point{   
   .......
    friend istream& operator>>(istream&, Point &p);
   .......
};

то можно ли в реализации этого оператора узнать, какой именно у меня входной istream поток - cin или ifstream?

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение15.02.2018, 19:46 


26/05/14
566
Пожалуйста, не делайте так. Это очень плохая идея.
Зачем вам понадобилось знать откуда вы читаете?

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение15.02.2018, 19:51 
Аватара пользователя


01/05/10
126
Такая постановка задачи - переопределить оератор ввода ">>" и для случая чтения с клавиатуры выводить пользователю на экран запрос на ввод каждой координаты точки, а для случая чтения из файла эти запросы не выводить, а просто читать координаты точки из потока.

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение15.02.2018, 20:00 


26/05/14
566
Никогда так не делайте. Этот код нарушает много правильных соглашений, но работает так как вам надо:
Код:
if (&input_stream == &std::cin) {
    std::cout << "prompt:";
}

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение15.02.2018, 20:32 
Аватара пользователя


01/05/10
126
спасибо

 Профиль  
                  
 
 Re: C++ потоки, читать из файла, а не с консоли
Сообщение16.02.2018, 06:17 
Заслуженный участник
Аватара пользователя


27/04/09
21952
Уфа
Kornelij в сообщении #1292707 писал(а):
Такая постановка задачи - переопределить оератор ввода ">>" и для случая чтения с клавиатуры выводить пользователю на экран запрос на ввод каждой координаты точки, а для случая чтения из файла эти запросы не выводить, а просто читать координаты точки из потока.
Просто принятие решения надо делать в другом месте: ведь, в самом деле, ваш же код наверняка и выбирает, какой поток брать, вот там и поставьте выбор того или иного сценария, а объектам класса, если так надо, передавайте, скажем, флаг. Или пусть они к этому состоянию как-то иначе имеют доступ, тут уже вам выбирать.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, PAV, Toucan, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group