Toon posts:

[c++] Converteren van float naar een string in c++

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dit moet in QNX gebeuren, die kent geen ftoa() functie.
Ik heb al gelezen dat het met sprintf kan. Maar snap het niet helemaal, kan iemand hier wat meer over uitleggen?

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 29-05 00:16
ahum.. verkeerd gelezen, sorry.

Verwijderd

Topicstarter
Ok, no prob.

  • ewasx
  • Registratie: Augustus 2000
  • Laatst online: 16-11-2025
Als het C++ is waar het om gaat en niet C:
code:
1
2
3
4
5
6
7
8
#include <sstream>

float fNumber = 10.0;
std::ostringstream os;

os << fNumber;          

string sNumber = fNumber.str();

  • woutertjez
  • Registratie: Januari 2001
  • Laatst online: 08:49
sprintf(stringnaam, "%f", floatingvariabele)

Dacht ik.... ;)

Verwijderd

Topicstarter
Ik zal even iets meer info geven :). Ben nu toch in QNX beland.

Dit is de bedoeling:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool Stream::saveAs(char file[])
{
    /*
     * Save a vector to a file
    */

    fd = open(file, O_RDWR);
    if ( fd == -1)  
    {
        return false;
    }
    for(int i = 0; i < (buffer->size()); i++)
    {
        anotherNumber = (ftoa(buffer->at(i), number)); 
        strcat(anotherNumber, '\n');
        write(fd, anotherNumber, strlen(fileBuffer));
    }   
    close(fd);
}

string ftoa(float num, string strNum)
{
    std::ostringstream os;

    os << num;                  

    strNum = fNumber.str();
    return strNum
}

Verwijderd

Waarom makkelijk als het moeilijk kan :)
code:
1
2
3
4
5
6
7
8
#include <fstream>
#include <algorithm>
#include <iterator>

...

std::ofstream os(fd);
std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<float>(os, "\n"));

Bovenstaande 2 regeltjes doen het zelfde als jouw SaveAs, ik heb maar met filedescriptors gewerkt.

Verwijderd

Topicstarter
Ok, dit is het nu geworden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool Stream::saveAs(char file[])
{
    /*
     * Save a vector to a file
    */

    fd = open(file, O_RDWR);
    if ( fd == -1)  
    {
        return false;
    }
    
    std::ofstream os(fd);
    std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<float>(os, "\n"));    
    close(fd);
}

En dit is de foutmelding die ik krijg :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
$ QCC Stream.cpp
Stream.cpp: In method `bool Stream::saveAs(char *)':
Stream.cpp:67: no matching function for call to `std::basic_ofstream<char,std::char_traits<char> >::basic_ofstream (int
&)'
/usr/include/fstream:453: candidates are: std::basic_ofstream<char,std::char_traits<char> >::basic_ofstream()
/usr/include/fstream:458:            std::basic_ofstream<char,std::char_traits<char> >::basic_ofstream(const char *
, std::_Iosb<int>::_Openmode = std::ios_base::out)
/usr/include/iosfwd:381:             std::basic_ofstream<char,std::char_traits<char> >::basic_ofstream(const std::ba
sic_ofstream<char,std::char_traits<char> > &)
Stream.cpp:68: request for member `begin' in `Stream::buffer', which is of non-aggregate type `std::vector<float,std::al
locator<float> > *'
Stream.cpp:68: parse error before character 0302
cc: /usr/lib/gcc-lib/ntox86/2.95.2/cc1plus error 33

Vet he :9~

NOT

Verwijderd

Op donderdag 13 juni 2002 13:09 schreef ber2002 het volgende:
Vet he :9~

NOT
Wat gebruik jij in godsnaam voor een C++ compiler?

ofstream::ofstream(int fd) is een standaard constructor bij mijn weten, en de foutmelding dat een vector<float> geen begin() method heeft is wel helemaal bizar.

Je compiler is dus idd. NOT VET.

<edit>
Ik zie nu net dat je een pointer naar die vector gebruikt, dus die begin() foutmelding is te verklaren. Waarom gebruik je een pointer? Je alloceert die vector toch niet met new hoop ik?
</edit>

Verwijderd

Topicstarter
QCC voor QNX :) Standaard compiler.

We zijn het nu met sprintf aan het proberen. En het is al gelukt.

Nu alleen de non-agregate "shit" eruit zien te krijgen. We hebben nu ook al g++ in gebruik als compiler.

  • NDF82
  • Registratie: Januari 2002
  • Laatst online: 07-07 08:50

NDF82

Doomed Space Marine

Ow neej he, QNX :r

Pentium 233MHz MMX + Diamond Monster 3D 3DFX Voodoo II


Verwijderd

Ok, maar dan nog moet ofstream een constructor hebben die een output stream aan een geopende filedescriptor hangt.

Daarnaast is het in 99.999999% van de gevallen een indicatie voor verkeerd design als je met pointers naar vectors of andere containers werkt, waarom doe je dat?

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 09:14

johnwoo

3S-GTE

Op donderdag 13 juni 2002 13:31 schreef mietje het volgende:
Ok, maar dan nog moet ofstream een constructor hebben die een output stream aan een geopende filedescriptor hangt.

Daarnaast is het in 99.999999% van de gevallen een indicatie voor verkeerd design als je met pointers naar vectors of andere containers werkt, waarom doe je dat?
We hadden die buffer eerst gewoon statisch gealloceerd, maar deze schitterende compiler begint dan te miepen: 'Sorry, not implemented. Overload not supported by blablabla...' zodra je een method probeert aan te roepen.

Dynamisch alloceren blijkt hij wel fijn te vinden; als we onze eigen klasse statisch instantieren dan levert dat ook weer een aantal 'non-aggregate' errors op. Doen we het dynamisch dan werkt het als een zonnetje.
Go figure..

Op deze manier ga je MSVC best wel waarderen...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Op donderdag 13 juni 2002 13:42 schreef johnwoo het volgende:
We hadden die buffer eerst gewoon statisch gealloceerd, maar deze schitterende compiler begint dan te miepen: 'Sorry, not implemented. Overload not supported by blablabla...' zodra je een method probeert aan te roepen.
:? dus als jij gewoon in een .cc file zet:
code:
1
2
3
#include <vector>

std::vector<float> buffer;

en dat vervolgens compileert, krijg je errors? Dan lijkt het me echt tijd om je compiler/libs te updaten, want er is waarschijnlijk aan gerotzooid of ze zijn niet compleet.
Dynamisch alloceren blijkt hij wel fijn te vinden; als we onze eigen klasse statisch instantieren dan levert dat ook weer een aantal 'non-aggregate' errors op. Doen we het dynamisch dan werkt het als een zonnetje.
Go figure..
Die "non-aggregates" krijg je als je "." ipv. "->" gebruikt of omgekeerd. Het wijst dus op een fout van jouw kant, en niet op een fout van de compiler.

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 09:14

johnwoo

3S-GTE

Op donderdag 13 juni 2002 13:53 schreef mietje het volgende:

[..]

:? dus als jij gewoon in een .cc file zet:
code:
1
2
3
#include <vector>

std::vector<float> buffer;

en dat vervolgens compileert, krijg je errors? Dan lijkt het me echt tijd om je compiler/libs te updaten, want er is waarschijnlijk aan gerotzooid of ze zijn niet compleet.
Statische declaraties in filescope willen weer wel, maar zodra we die vector<float> in onze klassedefinitie zetten (gewoon als private member) begint het gemiep :)
Ik weet niet hoe oud deze installatie is en wat er allemaal mee gebeurd is, maar het is wel vreemd :o
Die "non-aggregates" krijg je als je "." ipv. "->" gebruikt of omgekeerd. Het wijst dus op een fout van jouw kant, en niet op een fout van de compiler.
Vanzelfsprekend heb ik alle -> door . vervangen toen ik het net nog even statisch probeerde.

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Nog een paar mogelijke verbeteringen:

- Gebruik een const char * in plaats van een char[] als parameter.

- Je bent vergeten true te returnen als 't wel goed gaat. :) (Exceptions zijn natuurlijk nog beter..)

- basic_ofstream::basic_ofstream (const char * filename, ios_base::openmode)
Pagina: 1