compile probleem bij getline

Status
Niet open voor verdere reacties.

krisje8

Gebruiker
Lid geworden
6 jun 2007
Berichten
6
Hallo, ik krijg het volgende probleem:
Code:
/home/krisje8/ekht_manager/src/ekht_manager.cpp:25: error: cannot convert ‘std::string’ to ‘char**’ for argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’
/home/krisje8/ekht_manager/src/ekht_manager.cpp:26: error: cannot convert ‘std::string’ to ‘char**’ for argument ‘1’ to ‘__ssize_t getline(char**, size_t*, FILE*)’

Het gaat om dit stukje code (regel 25 en 26, in main(), sList1 en sList2 zijn strings) ):
Code:
	getline(listdowner(),sList1);
	getline(listdowner(),sList2);

listdowner:
Code:
string listdowner(){
string sList;

	if (CurlGetUrl("http://ekht.ifastnet.com/nodes/list", &sList) == 1){
	return sList;
	}
	else {
	cout<<"\33[1;31m Fout, lijst kon niet worden gedownload!\n";
	}
}

Wat ik dus probeer is het volgende:
Bestand (list) uitlezen in een string (sList), dit lukt gewoon.
Deze string doorgeven naar main(), ook dit lukt.
De regels een voor een uitlezen, dit lukt dus niet.
Volgens de errors maak ik op dat hij een char verwacht, maar volgens deze site zou hij juist een string moeten krijgen.

Hoe krijg ik dit werkend?
 
Het gaat om argument 1 van getline. Dat moet een (pointer naar een) input stream zijn.
 
Hoe zet ik listdowner() om in een stream?
Of is er een andere manier om uit listdowner() de regels uit te lezen?
 
hey,

ik heb hier een stukje code voor jou geschreven, je zou het moeten kunnen gebruiken

Code:
#include <iostream>
#include <fstream>

using namespace std;

#define itemdelimiter "\n"
int main()
    {
    string sList1 = "test.ip.1\ntest.ip.2";
    string sList2 = "";
    char buffer[sList1.length()];
    sprintf( buffer, "%s", sList1.c_str() );

    int x = 0;

    while( x < sizeof( buffer ) )
        {
        if( buffer[x] == *itemdelimiter )
            {
            cout << sList2 << endl;
            sList2 = "";
            }
        else
            {
            sList2 += buffer[x];
            }
        x++;
        }
    cout << sList2;

    cin.get();
    return 0;
    }

omdat ik de functie curlgeturl niet kon vinden heb ik gewoon een string gemaakt die hetzelfde bevat als het desbetreffende filetje wat jij daar gelinkt heb.
hierna heb ik nog wat variabelen gedeclareerd voor de loop.

de loop werkt zo:
hij stopt letter voor letter in een string variabele, dit doet hij totdat de letter die hij leest hetzelfde is als de itemdelimiter (in ons geval "\n" een newline oftewijl een enter). vind hij deze letter dan gooit hij de string op het scherm en maakt hij hem leeg voor de volgende regel.

de reden dat ik geen getline heb gebruikt is omdat getline voor een istream is. dit betekent dus een invoerstroom (vanaf het toetstenbord).

ik hoop je hiermee geholpen te hebben, zo niet reply nog even wat je dan precies wilt met die strings.

p.s. mijn 1e post weet niet of het codeblok werkt, vergeef mij :P
 
Ik heb het nog niet uitgetest, maar er komen uiteindelijk veel meer regels in dat tekstbestandje, en ik zou ook graag willen dat hij het aantal regels telt en ook zoveel strings ervoor aanmaakt.
Dus stel er zijn 15 regels, dat je dan sList1, sList2,... tot en met sList15 hebt, en dat ik ergens kan terug vinden hoeveen sList's er dan dus zijn.
(de regels komen allemaal in een keuze menuutje en krijgen verschillende eigen functies).
CurlGetUrl is een functie die cURL wrapt; hij download het bestandje en stopt het in een string.
En dit: #define itemdelimiter "\n" , # is toch voor compiler?
moet dat geen string itemdelimiter = "\n"; ofzo zijn?

Wel alvast bedankt voor de moeite (vooral het uitschrijven van de code, als het idd werkt heb je me daarmee heel erg geholpen).
 
wat betreft de #define, dit is inderdaad voor de compiler. het vertelt hem dat overal waar hij het volgende (in ons geval itemdelimiter) tegen komt hij het daarop volgende (in ons geval "\n") in moet vullen. voorbeeld:
#define drie 2
cout << drie + 2;
je krijgt dan 4. leuk he 4=drie+2 (lol ik maak je in de war, ik speel gewoon met de naam :P)

en wat betreft het aantal regels raad ik een vector aan. dus de volgende regels komen er dan bij:

#define <vector> (bij je defines)

vector<string> mylist; (bij je var declaraties)

mylist.push_back( sList2 );
( in het "if( buffer[x] == *itemdelimiter )" gedeelte)(en onderaan de while loops ofc)

cout << mylist.size(); (om het aantal strings dat er in de vector zitten op het scherm te zetten )

wil je op het einde alle strings op het scherm zetten dan zou je dit stukje code kunnen gebruiken:

Code:
vector<string>::iterator pos;
for( pos = mylist.begin(); pos != mylist.end(); ++pos )
    cout << *pos << endl;

dit kan je natuurlijk ook gebruiken om iets anders te doen met die strings

vraag me niet waarom ik zet "++pos" en niet "pos++", dat is een gewoonte voor mij bij iterators omdat ik ooit eens ergens gelezen heb dat dit beter is. ohja een iterator is gewoon een pointer hoor
 
Ok, ik snap nog niet echt helemaal wat vectors zijn en wat die code nu doet maar ik zal het wel proberen...
Werkt dat #define trouwens ook met gcc? Want daar compile ik namelijk mee...
 
hmm ik kan nooit onthouden wat gcc enzo allemaal is. ik heb het in dev-cpp gemaakt en daar werkt het in.

een vector is een array(lijst) die je aan kunt passen naarmate het aantal items dat je erin wilt stoppen. als je schrijft char buffer[10]; dan heb je een array waar 10 keer een 'char' in past. schrijf je echter vector<char>buffer; dan heb je een variabele waar je 'altijd' aan toe kunt blijven voegen. (natuurlijk afhankelijk van geheugen enzo). de grap van vectors is dus dat ze aanpasbaar zijn naar het aantal items maar ook dat je zelf kunt bepalen wat voor soort items, dit werkt dus ook:

Code:
class lollorz
{
private:
int x,y;
};
vector<lollorz> my_xy_points;
my_xy_points.push_back(lollorz(10,5));
als je dit gedaan hebt dan bevat de variabele 'my_xy_points' 1 lollorz item. (lollorz is een type net als string, int, char, bool, double, float etc,etc,etc)

belangrijke subfuncties van iedere vector zijn:
begin() (1e element van de vector)
clear() (maak vector leeg)
end() (laatste element)
erase(int) (verweider het element op deze plek)
pop_back() (verweider laatste element)
push_back() (voeg een element toe)
size() (geef de grootte)
[int] (referentie naar dit element, net als bij arrays)
voor meer functies moet je maar ff een tutor opzoeken ergens

al deze functies aan te roepen met een vector.functie() natuurlijk he ;)
 
ohja nog 1 belangrijk ding over vectoren. het is 1 grote stapel. je kunt niet onderuit iets weghalen (wel bekijken), zie het als een stapel boeken. je kan van alles de titel lezen maar je moet van bovenaf de boeken verweideren wil je de onderste uit de stapel kunnen halen

mocht je toch van voren af aan willen verweideren dat kan je een queue variabele gebruiken.
 
Verwijderen zal niet hoeven, de lijst wordt maar 1 keer per start van het programma geladen...
GCC, is de GNU Compiler Collection...
Het komt er op neer dat ik in Linux compile en mijn compiler gcc heet.
Ik kan je code nu niet uitproberen maar als ik vanavond weer tijd heb zal ik dat zeker doen.
Alvast bedankt!
 
Sorry dat ik zo lang niet heb kunnen antwoorden maar ik had het druk met school (proefwerkweek).
Ik heb het nog niet uitgetest, maar ik zal dat zeker binnenkort doen.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan