December 02, 2010
Matthias Pleh Wrote:

> 
> >
> > Thank you for your reply and yes that works :)
> >
> > Now i m facing with the following problem, what is the trick for input stream ?
> >
> > ( something like
> >
> > std::istream&  operator>>(std::istream&  in,A&  a)
> > {
> >    //  A.someData<<  in;
> >    return in;
> > }
> >
> > in C++ )
> >
> > I m thinking of the situation when we want to load some data from a file.
> >
> > The toString() trick is okay for saving the object... but how to load it back (something like fromString(char[]) would do the job but it does not exist in Object) ?
> >
> > Anyway thank you, you solved half of my problem :)
> >
> >
> 
> Ther are many posibilities, depending on your further needs! Just have a look at the online dokumentation: http://www.digitalmars.com/d/2.0/phobos/phobos.html
> 
> But my first try would be such ..
> (note: I've leaved out error-handling ...)
> 
> module test;
> 
> import std.stdio;
> import std.file;
> 
> class A
> {
>      void writeToFile()  { std.file.write("sample.txt",someData);   }
>      void readFromFile() { someData=cast(string)read("sample.txt"); }
>      void clear()        { someData="n/A\n"; }
>      string toString()   { return someData;  }
> private:
>      string someData="Just some data.
> With anohter line of date.
> Even more data.!";
> }
> 
> int main(string[] args)
> {
> 	A a=new A;
> 	a.writeToFile();
> 	a.clear();
> 	writeln(a);
> 	a.readFromFile();
> 	writeln(a);
> 	return 0;
> }

thank you for all your answers. I understand the approach, but in the same time, I have the feeling that the C++ way is more convenient.

Look in C++ , to define I/O  for A,  you do not have to modify your class A and simply have to overload two functions:

std::ostream& operator<<(std::ostream& out,const A& a)
std::istream&  operator>>(std::istream&  in,A&  a)

moreover this smoothly extend the I/O C++ framework without other side effect.

I was expecting to find a similar mecanism in D/Phobos

Perhaps by overloading some read(), write() functions of the Phobos library, but I do not know if it is "moral" to do that and which phobos functions are concerned... IMHO there is a documentation hole here


December 02, 2010
On 12/02/2010 09:05 AM, vincent picaud wrote:
> Matthias Pleh Wrote:
>
>>
>>>
>>> Thank you for your reply and yes that works :)
>>>
>>> Now i m facing with the following problem, what is the trick for input stream ?
>>>
>>> ( something like
>>>
>>> std::istream&   operator>>(std::istream&   in,A&   a)
>>> {
>>>     //  A.someData<<   in;
>>>     return in;
>>> }
>>>
>>> in C++ )
>>>
>>> I m thinking of the situation when we want to load some data from a file.
>>>
>>> The toString() trick is okay for saving the object... but how to load it back (something like fromString(char[]) would do the job but it does not exist in Object) ?
>>>
>>> Anyway thank you, you solved half of my problem :)
>>>
>>>
>>
>> Ther are many posibilities, depending on your further needs! Just have a
>> look at the online dokumentation:
>> http://www.digitalmars.com/d/2.0/phobos/phobos.html
>>
>> But my first try would be such ..
>> (note: I've leaved out error-handling ...)
>>
>> module test;
>>
>> import std.stdio;
>> import std.file;
>>
>> class A
>> {
>>       void writeToFile()  { std.file.write("sample.txt",someData);   }
>>       void readFromFile() { someData=cast(string)read("sample.txt"); }
>>       void clear()        { someData="n/A\n"; }
>>       string toString()   { return someData;  }
>> private:
>>       string someData="Just some data.
>> With anohter line of date.
>> Even more data.!";	
>> }
>>
>> int main(string[] args)
>> {
>> 	A a=new A;
>> 	a.writeToFile();
>> 	a.clear();
>> 	writeln(a);
>> 	a.readFromFile();
>> 	writeln(a);
>> 	return 0;
>> }
>
> thank you for all your answers. I understand the approach, but in the same time, I have the feeling that the C++ way is more convenient.
>
> Look in C++ , to define I/O  for A,  you do not have to modify your class A and simply have to overload two functions:
>
> std::ostream&  operator<<(std::ostream&  out,const A&  a)
> std::istream&   operator>>(std::istream&   in,A&   a)
>
> moreover this smoothly extend the I/O C++ framework without other side effect.
>
> I was expecting to find a similar mecanism in D/Phobos
>
> Perhaps by overloading some read(), write() functions of the Phobos library, but I do not know if it is "moral" to do that and which phobos functions are concerned... IMHO there is a documentation hole here
>
>

What you want is the new writeTo system for output. For input, a readFrom would be symmetrical and make sense :-)

To actually use it, you would just do myFile.write(your, stuff, etc);

For now, you can stringify using toString(). No way to read yet, except to!int, etc.

December 02, 2010
Pelle Månsson Wrote:

> On 12/02/2010 09:05 AM, vincent picaud wrote:
> > Matthias Pleh Wrote:
> >
> >>
> >>>
> >>> Thank you for your reply and yes that works :)
> >>>
> >>> Now i m facing with the following problem, what is the trick for input stream ?
> >>>
> >>> ( something like
> >>>
> >>> std::istream&   operator>>(std::istream&   in,A&   a)
> >>> {
> >>>     //  A.someData<<   in;
> >>>     return in;
> >>> }
> >>>
> >>> in C++ )
> >>>
> >>> I m thinking of the situation when we want to load some data from a file.
> >>>
> >>> The toString() trick is okay for saving the object... but how to load it back (something like fromString(char[]) would do the job but it does not exist in Object) ?
> >>>
> >>> Anyway thank you, you solved half of my problem :)
> >>>
> >>>
> >>
> >> Ther are many posibilities, depending on your further needs! Just have a look at the online dokumentation: http://www.digitalmars.com/d/2.0/phobos/phobos.html
> >>
> >> But my first try would be such ..
> >> (note: I've leaved out error-handling ...)
> >>
> >> module test;
> >>
> >> import std.stdio;
> >> import std.file;
> >>
> >> class A
> >> {
> >>       void writeToFile()  { std.file.write("sample.txt",someData);   }
> >>       void readFromFile() { someData=cast(string)read("sample.txt"); }
> >>       void clear()        { someData="n/A\n"; }
> >>       string toString()   { return someData;  }
> >> private:
> >>       string someData="Just some data.
> >> With anohter line of date.
> >> Even more data.!";
> >> }
> >>
> >> int main(string[] args)
> >> {
> >> 	A a=new A;
> >> 	a.writeToFile();
> >> 	a.clear();
> >> 	writeln(a);
> >> 	a.readFromFile();
> >> 	writeln(a);
> >> 	return 0;
> >> }
> >
> > thank you for all your answers. I understand the approach, but in the same time, I have the feeling that the C++ way is more convenient.
> >
> > Look in C++ , to define I/O  for A,  you do not have to modify your class A and simply have to overload two functions:
> >
> > std::ostream&  operator<<(std::ostream&  out,const A&  a)
> > std::istream&   operator>>(std::istream&   in,A&   a)
> >
> > moreover this smoothly extend the I/O C++ framework without other side effect.
> >
> > I was expecting to find a similar mecanism in D/Phobos
> >
> > Perhaps by overloading some read(), write() functions of the Phobos library, but I do not know if it is "moral" to do that and which phobos functions are concerned... IMHO there is a documentation hole here
> >
> >
> 
> What you want is the new writeTo system for output. For input, a readFrom would be symmetrical and make sense :-)
> 
> To actually use it, you would just do myFile.write(your, stuff, etc);
> 
> For now, you can stringify using toString(). No way to read yet, except to!int, etc.
> 

Yes, that is exactly what I want :)
Thanks

December 02, 2010
vincent picaud wrote:
> Matthias Pleh Wrote:
>> class A
>> {
[...]
>>      string toString()   { return someData;  }

> I have the feeling that the C++ way is more convenient.
>
> Look in C++ , to define I/O for A, you do not have to modify
> your class A and simply have to overload two functions:
>
> std::ostream& operator<<(std::ostream& out,const A& a)
> std::istream&  operator>>(std::istream&  in,A&  a)

Yes but those two functions are actually logical parts of the class's interface. Besides, in many cases a 'friend' declaration is needed.

Tangentially, operator>> is overrated because it requires a complete object to work on. I find it exremely rare to input on top of an existing object, which would also require a default constructor; and being forced to write a default constructor is unpractical in some cases.

Reading from a stream should have been designed to return a constructed object:

    auto a = readFrom!A(some_input);

or as a static member function:

    auto a = A.readFrom(some_input);

Ali
1 2
Next ›   Last »