считать структуру
От: barmale-y  
Дата: 12.06.10 07:36
Оценка:
Известно что структура сидит в строке, но элементы (вещественные числа) разделены не только пробелами а чем угодно. Что можно сделать чтобы оператор << читал правильно поля структуры?

$ c++ main.cc -o main && ./main 
1.1 мусор всякий и пробелы 2
1.1000000000 0.0000000000

вот в этом примере 2.0 нужно было заметить.


$ cat main.cc
#include <iostream>
#include "test.hpp"

main(){
    using std::cout ; using std::endl; using std::cin;
    TEST<double> X;
    cin >> X;
    cout << X;
}

$ cat test.hpp
#ifndef  _TTEST_HPP
#define _TTEST_HPP 

#include <cmath>
#include <limits>
#include <iostream>
#include <iomanip>


template <typename elemType> class TEST {
public:
   elemType x,y;
   TEST(const elemType & _x = elemType(), const elemType & _y = elemType()):  x(_x), y(_y) {}
};


using std::ostream; using std::istream;

template<typename elemType> ostream& 
operator<<(ostream& os, const TEST<elemType> & v){
 os << std::fixed << std::setprecision(10) << std::setw(12) << v.x << ' ' << v.y <<' '  << std::flush;
 return os;
}

template<typename elemType> istream& 
operator>>(istream& is,  TEST<elemType> & v){
 is >> v.x >>  v.y ;
 return is;
}

#endif
Re: считать структуру
От: barmale-y  
Дата: 12.06.10 07:54
Оценка:
да, проблема еще в том, что getline я всю строку дернуть не могу и разобрать, т.к. в одной и той же строке может находится несколько структур.

1 мусор 2.1  ; 4.1 3 опять мусор 5.2 2 3.2 4.3
Re[2]: считать структуру
От: barmale-y  
Дата: 12.06.10 08:43
Оценка:
кроме автомата ничего придумать не могу, но даже первое пока целое число считать не получается
template<typename elemType> istream& operator>>(istream& is,  TEST<elemType> & v){
 enum state {D,H,F} cs = H;
 char ch;..
 double _x = 0 , _y = 0;..
 is >> ch;
 do {  switch(cs)   {
      case H:.
                  if( !isdigit(ch) ) { is>>ch; } else { _x= ch++-'0'; cs=F; }.
                  break;
      case D:.
                 if( isdigit(ch) ) {
                     _x=10*_x+(ch++)-'0';.
                     is>>ch;
                 }  else {.
                     cs=F;.
                 }
                 break;
    }
 } while ( cs =! F);

 return is;
}

$ c++ main.cc -o main && ./main 
test.hpp: In function ‘std::istream& operator>>(std::istream&, TEST<elemType>&) [with elemType = double]’:
main.cc:7:   instantiated from here
test.hpp:43: ошибка: ошибка преобразования ‘bool’ в ‘operator>>(std::istream&, TEST<elemType>&) [with elemType = double]::state’ в assignment
Re[3]: считать структуру
От: saf_e  
Дата: 12.06.10 15:47
Оценка:
Здравствуйте, barmale-y, Вы писали:

Думаю самый простой вариант считывать как строку.

Потом:

1. Если ";" стартуем новую структуру.
2. Если конвертится в число -- добавляем элемент в текущую.
3. Иначе мусор -- скипаем.

Это если я все правильно понял
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.