string in structure and fread()

Juan Ramírez jramirez@inconcertcc.com
Mon Dec 26 20:01:00 GMT 2011


> What do you mean by "c++ objects"?>> A POD struct is a "c++ object"

of course, that's out of the question here

> Assuming you mean non-POD class types with non-trivial constructors
> and/or non-POD members, I strongly disagree, there is nothing wrong
> with doing IO with suh types, you just need to write the IO code
> correctly, which is always true

I know you are right, but looking at Mohsen's code I can tell that he
has not a C++ guru, and getting into the that could lead to a lot of
problems.
In order to use c++ string he should resize the string to the fixed
length of 101 and then perform a call to fread using &str[0] (to treat
is as an array), the same behavior if vector<char> is used.

> That solution is useless if the strings can be arbitrarily long, a
> better solution is to store the strings in the file as
> null-terminated, or length-prefixed, and in either of those cases
> managing the strings in the program will be simpler with std::string.

Well, I made that only because Mohsen said strings have fixed length.

Regards


Saludos!
     Juan




2011/12/26 Jonathan Wakely <jwakely.gcc@gmail.com>:
> 2011/12/25 Juan Ramírez:
>> Hi,
>>
>> If you want to write and read a raw structure to a file, using c++
>> objects is NOT recommended at all! At least not using fread/fwrite
>
> What do you mean by "c++ objects"?
>
> A POD struct is a "c++ object"
>
> Assuming you mean non-POD class types with non-trivial constructors
> and/or non-POD members, I strongly disagree, there is nothing wrong
> with doing IO with suh types, you just need to write the IO code
> correctly, which is always true.
>
>
>> Given that fields have fixed length, a good solution could be using a
>> raw char array, something like this:
>>
>>     #define FIELD_LENGTH   101
>>
>>     struct book {
>>         char name[FIELD_LENGTH];
>>         char author[FIELD_LENGTH];
>>         char publisher[FIELD_LENGTH];
>>         char translator[FIELD_LENGTH];
>>         bool translation;
>>         bool stock;
>>     };
>
> That solution is useless if the strings can be arbitrarily long, a
> better solution is to store the strings in the file as
> null-terminated, or length-prefixed, and in either of those cases
> managing the strings in the program will be simpler with std::string.



More information about the Gcc-help mailing list