[C++] meerdere tekstbestanden opslaan in 1 tekstbestand

Pagina: 1
Acties:

  • 0123456
  • Registratie: Maart 2005
  • Laatst online: 28-07-2010
Ik heb al wat verschillende fora en alles gelezen, maar nog geen oplossing!!!

Ik heb dus verschillende tekstbestanden met een variabele naam:

Fouten 20050808 2345 001.txt
Fouten 20050809 7654 002.txt
etc...

Nou heb ik de bestandsnamen al allemaal gefilterd en in een Memo staan....
Nou wil ik dus al deze gefilterde tekstbestanden in 1 tekstbestand krijgen (Fouten week 32.txt)

Ik heb het bestand "Fouten week 32.txt" al aangemaakt, maar mijn probleem is dat ik alle bestanden die ik wil lezen + schrijven niet kan openen...
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
30
31
32
33
34
35
36
37
void __fastcall TForm1::ButtonStartClick(TObject *Sender)
{
  char ch;
  AnsiString Path = LabelPath->Caption;
  AnsiString Naam;
  AnsiString WeekNummer = WeekOfTheYear(MonthCalendar1->Date);
  WeekNummer = Path+"\\Fouten week "+WeekNummer+".txt";
  for (int m=0;m<=Memo1->Lines->Count;m++)
  {
    Naam = Path+"\\"+Memo1->Lines->Strings[m];
    char *file= Naam.c_str();
    char *file2= WeekNummer.c_str();
    ifstream invoer;
    ofstream uitvoer;
    invoer.open(file,ios::in);  <=hier gaat het fout (ligt niet aan de ios::in!!!)
    //uitvoer.open(file2,ios::app);
    if (invoer.fail())
    {
      ShowMessage("De invoer-file bestaat niet of kan niet geopend worden.");
      invoer.close();
      uitvoer.close();
    }
    else if (uitvoer.fail())
    {
      ShowMessage("De uitvoer-file bestaat niet of kan niet geopend worden.");
      invoer.close();
      uitvoer.close();
    }
    else
    {
      while(invoer.get(ch))
        uitvoer.put(ch);
      invoer.close();
      uitvoer.close();
    }
  }
}

Nou krijg ik dus de invoer.fail (en anders ook de uitvoer.fail) te zien.
file = een goede bestandsnaam
file2 = ook een goede bestandsnaam

Ik heb al heel veel verschillende oplossing geprobeerd, maar niks werkt...

[ Voor 6% gewijzigd door 0123456 op 22-08-2005 12:44 ]


  • FvH
  • Registratie: Oktober 2001
  • Laatst online: 09-04 15:06

FvH

Aan het typen...

Al eens een breakpoint gezet en gekeken wat er precies in de vars terecht komt?

What are clouds made of? Linux servers mostly!


  • 0123456
  • Registratie: Maart 2005
  • Laatst online: 28-07-2010
Jep, alles gaat goed tot de "ifstream invoer;" voorkomt...
Als ik dan op "invoer"ga staan, dan krijg ik allemaal rare tekens, dit kan kloppen...

Als dit wel klopt (waar ik vanuit ga), dan gaat het goed tot de "if (invoer.fail())" regel, want daar geeft ie de bijbehorende foutmelding... :(

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-05 21:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Je weet verder ook zeker dat de paden kloppen?

En je kunt de contents van een istream ineen keer schrijven naar een ostream dmv uitvoer << invoer.rdbuf(), dat is wat efficienter dan byte voor byte overzetten ;)

Waarom alloceer je trouwens 2 char buffers voor die files, die je vervolgens kwijt bent omdat je er een nieuwe pointer aan assignt (memleak dus)?

[ Voor 36% gewijzigd door .oisyn op 22-08-2005 12:19 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • 0123456
  • Registratie: Maart 2005
  • Laatst online: 28-07-2010
Jep, mijn paden kloppen:
file = "D:\\test tekst\\Fouten 20050808 2345 001.txt"
file2= "D:\\test tekst\\Fouten week 32.txt"

Dit klopt allemaal (zelfs de hoofdletters en al)

Maar hij kan hem in het programma niet openen...

En wat bedoel je met de memleak???
Path namen moeten toch chars zijn??? :?

[ Voor 20% gewijzigd door 0123456 op 22-08-2005 12:35 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-05 21:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het punt is dat je een new char[] doet, dat levert een pointer op die je aan file assignt. Vervolgens assign je aan file het resultaat van Naam.c_str(), je oude waarde van file ben je dus kwijt. Net als dat je een int hebt die eerst 1 is, en er vervolgens 3 van maakt, dat je de 1 dan kwijt bent. Het zijn pointers, er wordt dus niet automatisch wat geheugen rondgekopieerd (dit is basis C/C++ kennis)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • 0123456
  • Registratie: Maart 2005
  • Laatst online: 28-07-2010
OK, ik zie het...
Ik heb het even aangepast..

Bedankt!!! _/-\o_

Maar terug naar het andere probleem, het kopieren van de bestanden...

  • schoene
  • Registratie: Maart 2003
  • Laatst online: 09:21
C++:
1
2
3
4
for (int m=0;m<=Memo1->Lines->Count;m++)
{
  // ...
}

Heb je al gemerkt dat je tot en met Memo1->Lines->Count de regels doorloopt?
het moet zijn
C++:
1
2
3
4
for (int m=0;m<Memo1->Lines->Count;m++)
{
  // ...
}

en probeer eens nuttige namen te geven aan je componenten. TForm1, Memo1, ...
Daarmee is niet duidelijk wat ermee moet gebeuren.

Edit:

En in plaats van de backslashes effectief te tikken kan je ook
C++:
1
AnsiString Path = IncludeTrailingPathDelimiter (LabelPath->Caption);

gebruiken. Indien LabelPath->Caption al met een backslash zou eindigen, dan
wordt er geen meer aan toegevoegd, anders wel.

En file en file2 heb je eigenlijk ook niet nodig, je kan meteen Naam en Weeknummer
gebruiken:

C++:
1
2
    invoer.open(Naam.c_str(),ios::in);  <=hier gaat het fout (ligt niet aan de ios::in!!!)
    uitvoer.open(WeekNummer.c_str(),ios::app);

[ Voor 45% gewijzigd door schoene op 22-08-2005 14:02 ]


  • 0123456
  • Registratie: Maart 2005
  • Laatst online: 28-07-2010
Ik heb gekeken wat hierboven staat, maar het helpt allemaal niks...

Op de een of andere manier gaat het openen fout, want de namen van de componenten kloppen...

Ik heb hem volgens mij al gevonden, ik maak eerder in de code het bestand Fouten week 32.txt al aan en die overschrijft de gemaakte log-bestanden... :+

Als nog, BEDANKT voor jullie hulp!!!! _/-\o_
Pagina: 1