Известно что структура сидит в строке, но элементы (вещественные числа) разделены не только пробелами а чем угодно. Что можно сделать чтобы оператор << читал правильно поля структуры?
$ 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
да, проблема еще в том, что getline я всю строку дернуть не могу и разобрать, т.к. в одной и той же строке может находится несколько структур.
1 мусор 2.1 ; 4.1 3 опять мусор 5.2 2 3.2 4.3
кроме автомата ничего придумать не могу, но даже первое пока целое число считать не получается
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
Здравствуйте, barmale-y, Вы писали:
Думаю самый простой вариант считывать как строку.
Потом:
1. Если ";" стартуем новую структуру.
2. Если конвертится в число -- добавляем элемент в текущую.
3. Иначе мусор -- скипаем.
Это если я все правильно понял