Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение значений из файла (С++) / 7 сообщений из 7, страница 1 из 1
21.04.2006, 15:09
    #33682962
Landanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
Приношу свои извинения за кучу созданных тем, но уж больно помогают тут хорошо, даже как-то непривычно :)

Итак, имеется у меня текстовый файл примерно такого содержания:

автор
2006.12.25 "New Year Party" 17:30:00 1:00:00

Есть у меня в программе следующие переменные:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#include "Date.h"
#include "Time.h"

int main()
{
   ifstream input("file.txt");
   string description;
   Date occurence;
   Time startTime;
   Time endTime;

Нужно вписать значения из файла в эти переменные.
Всё бы ничего, но вот проблема возникает, когда надо вписать description.
Допусим, делаю так:

Код: plaintext
1.
2.
input >> occurence.year >> occurence.month >> occurence.day;
input >> description;
Вот тут возникают проблемы, т.к. в description запишется только "New

В этом и состоит вопрос:
Как организовать, чтобы в description вписалось только то, что находится в кавычках? Очень желательно, чтобы кавычки не вписывались в строку.
Есть ли у класса ifstream какие-то методы, где можно утснавливать терминаторы на определенные символы?
...
Рейтинг: 0 / 0
21.04.2006, 15:33
    #33683060
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
Landanan
Есть ли у класса ifstream какие-то методы, где можно утснавливать терминаторы на определенные символы?

Есть функция чтения строки из потока - getline. Там можно указать параметр разделитель. Только первую кавычку надо будет как-нибудь пропустить (прочитать ее в какой-нть char или по-другому)

пример:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n1, n2;
    string s;

    cin >> n1;
    char ch;   cin >> ch;  // пропуск первой кавычки.. чуть коряво, но сойдет :)
    getline(cin, s, '\"');
    cin >> n2;

    cout << n1 << " " << s << " " << n2;
    return  0 ;
}


ввод:
1 "bla bla bla" 2
вывод
1 bla bla bla 2
...
Рейтинг: 0 / 0
21.04.2006, 15:39
    #33683084
Landanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
Хмм...не знаю как это будет работать при чтении из файла, но сейчас попробую. Спасибо! :)
...
Рейтинг: 0 / 0
21.04.2006, 15:49
    #33683127
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
LandananХмм...не знаю как это будет работать при чтении из файла, но сейчас попробую. Спасибо! :)

Так же будет работать. Там параметр - поток ввода. А с консоли он (cin) или файловый (ifstream), какая разница?
...
Рейтинг: 0 / 0
21.04.2006, 15:56
    #33683149
Landanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
Хмм...с файлом работает.
Ладно, усложнаю задачу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class C1
{
   string description;

   public:
      friend istream& operator >> (istream& in, C1& obj)
};

istream& operator >> (istream& in, C1& obj)
{
   getline(in, obj.description);  
   // Учитывая, что main код выглядит так: 
   // C1 test; cin >> test;
   // и пользователь не вводит кавычки вначале и вконце строки

   return in;
}

А если еще учесть, что я могу использовать оператор >> при чтении из файла, где имеются эти самые кавычки, но их нужно обойти?

Типа этого:

Код: plaintext
1.
2.
C1 test;
ifstream input("file.txt");
input >> test;

Начинаю сходить с ума...
...
Рейтинг: 0 / 0
21.04.2006, 16:17
    #33683236
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
LandananХмм...с файлом работает.
Ладно, усложнаю задачу:

...
// и пользователь не вводит кавычки вначале и вконце строки
...
если еще учесть, что я могу использовать оператор >> при чтении из файла, где имеются эти самые кавычки, но их нужно обойти?


Ну если кавычки присутствуют в файле, но в консоли не вводятся, то можно и написать два оператора, один для cin, другой для ifstream :) Типа такого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
class C1
{
   string description;

   public:
      friend istream& operator >> (istream& in, C1& obj);
      friend ifstream& operator >> (ifstream& ifs, C1& obj);
};

istream& operator >> (istream& in, C1& obj)
{
   getline(in, obj.description);  
   return in;
}

ifstream& operator >> (ifstream& ifs, C1& obj)
{
   char ch; 
   ifs >> ch;
   getline(ifs, obj.description, '\"');  
   return ifs;
}

Но лучше так не делать.
Вообще я бы не стал перегружать функциональность класса чтением (или записью) своего содержимого из разных источников. Лучше вынести это во внешние функции, которые можно сделать сколь угодно сложными (проверять источник, формат и корректность входных данных... там уже накрутите что вам надо), а в интерфейсе класса оставить простые как валенок методы set и get для членов.
...
Рейтинг: 0 / 0
21.04.2006, 16:32
    #33683300
Landanan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чтение значений из файла (С++)
Вот идею перегрузки че-то упустил...надоть попробовать.

Вопрос: а почему не стоит перегружать класс?
Ведь, помучившись раз, я значительно облегчу работу тем, кто будет использовать мой класс в своих программах: им не надо будет думать как там чего перегрузить - всё будет уже готово.
По-моему, запихивание всего возможного в класс наоборот придает ему гибкости...
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Чтение значений из файла (С++) / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]