оператор >> работает в Visual C ++ 2010, но не G ++ в Linux - PullRequest
4 голосов
/ 24 декабря 2011

У меня следующая проблема:

У меня есть код, который отлично работает с Visual C ++ 2010, но когда я компилирую его в Linux, он компилируется, но что-то там не работает:

это мой Vector вход operator>>:

istream& operator>>(istream& in,Vector& x)
{
char a;
in.sync();
a=in.get(); //gets the '['
for(int i=0;i<x._n;i++)
    {
        in>>x._vector[i];
        if ((i+1)!=x._n)
        a=in.get(); //gets the ','
    }
in>>a; //gets the ']'
return in;
}

_vector точек на массиве с номером Complex, operator>> из Complex работает нормально.

Входные данные должны выглядеть следующим образом:

[2+3i,9i,1]

Когда я запускаю этот код на Visual C ++ 2010, он работает и выглядит так:

cin>>v; // [1+1i,2]
cin>>u; // [10,5i]
cout<<v<<endl; //prints: [1+i,2]
cout<<u<<endl; //prints: [10,5i]

Когда язапустить тот же код в Linux, после первого массива [1+1i,2] программа заканчивается:

[1+1i,2]  //this is the input
[6.105e-317+6.105e-317i,6.105e-317+6.105e-317i]
[6.105e-317+6.105e-317i,6.105e-317+6.105e-317i]

Теперь я даже не могу написать другой Vector

Кстати: это мойVector.h

#ifndef _VECTOR_
#define _VECTOR_

#include <iostream>
using namespace std;
#include "Complex.h"

class Vector
{
private:
    int _n;
    Complex *_vector; //points on the array of the complex numbers
public:
    Vector(int n); // "Vector" - constructor of Vector with n instants
    Vector(const Vector& x);  // "Vector" - copy constructor of Vector with n instants
~Vector(); // "~Vector" - destructor of Vector
const Vector& operator=(const Vector& x); // "operator=" - operates "=" for Vector
Complex& operator[](const int index); // "operator[]" - choose an instant by his index in the _vector
const Vector operator+(const Vector& x) const; // "operator+" - operates "+" between two vectors
const Vector operator-(const Vector& x) const; // "operator-" - operates "-" between two vectors
const Vector operator*(double scalar) const; // "operator*" - multiplate all of the instants of the vector by the scalar
friend const Vector operator*(double scalar,const Vector& x); // "operator*" - multiplate all of the instants of the vector by the scalar
const Complex operator*(const Vector& x) const; // "operator*" - operates "*" between two vectors
const Vector& operator+=(const Vector& x); // "operator+=" - operates "+=" for the instant
const Vector& operator-=(const Vector& x); // "operator-=" - operates "-=" for the instant
friend ostream& operator<<(ostream& out,const Vector& x); // "operator<<" - prints the vector
friend istream& operator>>(istream& in,Vector& x); // "operator<<" - gets the vector
const double operator!() const; // "operator!" - returns the the instant in the definite value of the vactor that his definite value is the highest (in the Vector)
};
    #endif

и вот где я определяю конструктор Vector: Vector.cpp

#include <iostream> 
using namespace std;
#include <math.h>
#include "Complex.h"
#include "Vector.h"

// "Vector" - constructor of Vector with n instants
Vector::Vector(int n)
{
    _vector=new Complex[n]; //new vector (array) of complex classes
    _n=n;
}

Кто-нибудь может мне помочь?

1 Ответ

6 голосов
/ 24 декабря 2011

Я предполагаю, что проблема в вашем звонке на in.sync().

Это очищает входной буфер, то есть отбрасывает все данные, которые в данный момент находятся в буфере istream. Что именно помещается в буфер, зависит от: а) вашей платформы и б) того, что вы сделали перед вызовом operator>>.

Что касается б), именно поэтому неправильно называть sync с operator>>, но это "ваша проблема".

Что касается а), вы должны знать, что системы UNIX выполняют буферизацию строк для консольного ввода текста на уровне операционной системы, прежде чем istream получит право голоса. Данные, которые вы хотите очистить, могут находиться в буфере операционной системы, а не в буфере istream.

Если вы просто хотите пропустить пробел, вы должны использовать in >> std::ws;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...