vraagje over c_str()

Status
Niet open voor verdere reacties.

tchembado

Gebruiker
Lid geworden
28 nov 2006
Berichten
93
hoi, ik probeer een programma te maken om te tellen hoeveel txt bestanden ik heb van de vorm mapn.txt

hiervoor heb ik de volgende code.

Code:
#include "iostream"
#include "fstream"
#include "convert.h"


using namespace std;

ifstream myfile;

int main()
{

int aantal = 0;


string s;
string t = ".txt";


for(int n = 1;n<=20;n++)
{
   s = "test";
  s+=convert<string>(n);
  s+=t;
  
  cout<<s<<endl;


                 
myfile.open(s.c_str());
if (myfile!=0) aantal++;
myfile.close();
}



cout<<"aantal bestaande .txt documenten = "<<aantal;
getchar();
}

ik krijg echter altijd '0' als output. Dit komt denkik doordat

"Note that since the returned pointer is of type const, the character data that c_str() returns cannot be modified. Furthermore, you do not need to call free() or delete on this pointer."


want als ik dit slechts 1 keer doe, met bijvoorbeeld n = 4 dan krijg ik aantal = 1. (want het bestand test4.txt) bestaat inderdaad.

Hoe moet ik dit free() of delete gedoe laten werken want dat werkt niet.

Of is er misschien iets anders dat ik fout doe,

alle hulp is welkom,
groetjes,
Tchembado



ps, het convert.h ziet er zo uit:

Code:
#ifndef CONVERSIE_H
#define CONVERSIE_H

#include <iostream>
#include <sstream>
using namespace std;

template <class doelType, class inputType>

doelType convert(const inputType & t)
{
    stringstream s;   //een stringstream aanmaken voor zowel lezen als schrijven
    s << t;           //de input in de stringstream plaatsen
    doelType resultaat;  //een variable van het juiste output-type aanmaken
    s >> resultaat;      //de opgeslagen input, naar de output converteren
    return resultaat;
}

#endif  //CONVERSIE_H
 
Laatst bewerkt:
ik heb ondertussen al gemerkt dat je net hetzelfde probleem krijgt als .c_str() vervangt door .data() dus als je daar iets meer van weet is uiteraard ook alle hulp welkom. :thumb:

In principe zoek ik gewoon een manier om bestanden te vinden.

alvast bedankt,
Tchembado
 
Om te kijken of een file open is kan je gebruik maken van file.is_open().
if (file != 0) werkt niet

En dan nog 2 dingen:
1. probeer het gebruik van globale variabelen zoveel mogelijk te beperken, er is geen enkele reden om myfile buiten de main te zetten..
2. vergeet return 0; of return EXIT_SUCCES; op het einde van je programma niet! dit commando zorgt ervoor dat het besturingssysteem weet dat het programma succesvol werd beëindigd.

code die bij mij werkt;
Code:
#include <iostream>
#include <fstream>
#include "convert.h"
using namespace std;

int main()
{
    ifstream myfile;
    int aantal = 0;

    string s;
    string t = ".txt";

    for(int n = 1; n <= 20; n++) {
        s = "test";
        s += convert<string>(n);
        s += t;

        cout << s << endl;

        myfile.open(s.c_str());
        if (myfile.is_open()) {
            aantal++;
            cout << "\tBINGO" << endl;
            myfile.close();
        }
    }

    cout << "aantal bestaande .txt documenten = " << aantal;
    getchar();
    
    return 0;
}

--Johan

[EDIT]
ohja, je moet een file enkel sluiten als ie geopend werd... daarom heb ik dat commando binnen de if-structuur gezet ;)
[/EDIT]
 
Laatst bewerkt:
Held die je bent! :p

Kzal proberen in het vervolg zoveel mogelijk rekening te houden met je typs :thumb: ,

bedankt,

Tchembado
 
L O L:p


nu heb ik in de bestanden een cijfer gezet. Wanneer ik dit programma wil uitlezen werkt dit niet.

Ik probeer dit met volgende code:

Code:
#include <iostream>
#include <fstream>
#include "convert.h"
using namespace std;

int main()
{
    ifstream myfile;
    int aantal = 0;

    string s;
    string t = ".txt";
    int x;

    for(int n = 0; n <= 20; n++) {
        s = "test";
        s += convert<string>(n);
        s += t;

        myfile.open(s.c_str());
        if (myfile.is_open()) {
            aantal++;
            myfile>>x;
            cout<<x<<endl;
            
            myfile.close();
        }
    }

    cout << "aantal bestaande .txt documenten = " << aantal;
    getchar();
    
    return 0;
}

Deze is dus fout, aangezien ik altijd 0 krijg (wanneer ik meer dan 1 bestand heb, bij 1 bestand krijg ik een ander raar getal).

Khoop dat er ook hiervoor een oplossing bestaat :p

Ik vroeg mij trouens ook nog af wat de code is om een bestand te deleten.

Alvast bedankt,

Groetjes,

Tchembado
 
ik denk dat ik je fout gevonden heb (kan het nu wel niet testen)

als je iets inleest van een bestand krijg je een string, en jij slaat die direct op in een int..

Ik ben niet zeker maar probeer het inlezen eerst eens naar een string te doen en die dan te converten?

--Johan
 
ik denk dat ik je fout gevonden heb (kan het nu wel niet testen)

als je iets inleest van een bestand krijg je een string, en jij slaat die direct op in een int..

Ik ben niet zeker maar probeer het inlezen eerst eens naar een string te doen en die dan te converten?

--Johan


Altijd verwarrend, die streams... Persoonlijk gebruik ik altijd de C functies (fopen, fread, atoi)...
 
pffft, kloop inderdaad om de vijf minute vast met fstream. Maar dat komt dan vooral door mijn gebrekkige kennis, en niet om dat fstream zou zuigen :p

Nu heb ik dit gedaan

Code:
#include <iostream>
#include <fstream>
#include"convert.h"

using namespace std;

int main()
{
    string s;
    string t = ".mp";
    string temp;
    
      ifstream myfile;
    int count=0;
        
    
  
    
    for(int n = 0;n<=20;n++)
    {
            s = "map";
            s+=convert<string>(n);
            s+=t;
            int x;
            
            myfile.open(s.c_str());
            if(myfile.is_open())
            {
            myfile>>temp;
            x=convert<int>(temp);
            cout<<x<<endl;;
            count++;
            myfile.close();
            }
            
            }
    cout<<count;
    getchar();
}
en het werkt nog altijd niet :confused:

Dus kdenk ni dat het fout ga doordat ik het direct in een int zet. Als ik het programma trouens maar 1 keer laat draaien, met for(int n = 1;n<=1;n++), en ik zet het direct in een int, werkt het programma direct...
 
Code:
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])
{
    string tmp, tmp2;
    stringstream stream;
    ifstream file;
    int counter = 0;
    
    for(int i = 1; i <= 20; i++)
    {
            stream << i;
            tmp = "map" + stream.str() + ".txt";
            file.open(tmp.c_str());
            if(file.is_open())
            {
                counter++;
                while(!file.eof())
                {
                                  getline(file, tmp2);
                                  cout << tmp2 << endl;
                }
                file.close();
            }
            file.clear(); // edit: clear() stond op de verkeerde plek
            stream.str(""); 
    } 
            cout << "Aantal bestanden: " << counter << endl;
            
    system("PAUSE");
    return EXIT_SUCCESS;
}

Je had file.clear() eerst nog moeten aanroepen.
 
Laatst bewerkt:
Het is al een hele verbetering tegenover enkel nulle, maar nu slaagt het programma tilt wanneer er een bestand niet meer bestaat. Wanneer bijvoorbeeld bestand 1 tot en met 3 bestaan, 4 niet, en dan 5-10 weer wel, dan geeft het programma als output voor die van 5 dezelfde output als voor het laatste bestand dat bestond, voor het bestand dat dat niet bestaat.

Dus als bestand 1-3 bestaan, 4 niet,en dan 5 tot ... bestaat weer wel. Ik zet in elk bestand de nummer van het bestand. In bestand 1 dus 1, in bestand 2 een 2...

dan krijg ik als output:

1
2
3
3
6
7
...

Mijn code is:
Code:
#include <iostream>
#include <fstream>
#include"convert.h"

using namespace std;

  ifstream myfile;

int main()
{
    string s;
    string t = ".txt";
    ifstream myfile;
    
    int count=0;
          int x;
    
  
    
    for(int n = 1;n<=20;n++)
    {
            s = "test";
            s+=convert<string>(n);
            s+=t;
          
            
            myfile.open(s.c_str());
            if(myfile.is_open())
            {
            myfile>>x;
            cout<<x<<endl;;
            count++;
            myfile.clear();
            myfile.close();
            }
            
            }
    cout<<endl<<count;
    getchar();
}
 
clear() moet je buiten de loop aanroepen. (eigenlijk ook wel logisch, aangezien clear() in jouw(en ook de mijne dus :$) code alleen werd aangeroepen wanneer het bestand bestaat. ->if(myFile.is_open()) )

Code:
    for(int n = 1;n<=20;n++)
    {
            s = "test";
            s+=convert<string>(n);
            s+=t;
          
            
            myfile.open(s.c_str());
            if(myfile.is_open())
            {
            myfile>>x;
            cout<<x<<endl;;
            count++;
            myfile.close();
            }
            myFile.clear();
            
            }

Als je dadelijk met strings zou willen werken, dan zou ik gewoon dat stukje van while(!myFile.eof()) en getline gebruiken. Anders kapt ie af op spatie's.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan