[VC++] File kopieren

Pagina: 1
Acties:

  • Da_Hardest
  • Registratie: November 2002
  • Laatst online: 09-08-2025

Da_Hardest

-= BrainB0ne =-

Topicstarter
Hallo, ben pas met VC++ begonnen op mijn stageopdracht, ik ben aant testen hoe ik met file-IO moet omgaan, ik wil een kopie maken van een tekstbestand om te beginnen eens, ik heb onderstaande functie gemaakt, hij doet het bijna goed, alleen als er %-tekens in worden gebruikt gebeuren er dingen die in niet verwacht.. misschien kan iemand mij helpen?

Als ik bijv. als input geef: dit is een string %
dan wordt de output: dit is een string

het % teken wordt dan weggelaten.
geef ik als input: dit is een% string
dan is de output: dit is een°Atring

Ik vat het niet? iemand een logische verklaring?

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CStringtofileDlg::OnBstart() 
{
    // TODO: Add your control notification handler code here
    CString TheFile = "C:\\str\\str.txt";
    CString TempFile = "C:\\str\\strtemp.txt";
    CString FileText = "";
    
    char c;
    FILE* pSearchFile;
    FILE* pTempFile;
    
    if (pSearchFile = fopen(TheFile, "r"))
    {
        if (pTempFile = fopen(TempFile, "w"))
        {
            while((c=getc(pSearchFile)) != EOF)
                FileText += (CString) c;
        }
        fprintf(pTempFile, FileText);
        fclose(pTempFile);
    }
    fclose(pSearchFile);
    
}

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Dat komt doordat % een speciaal karakter is voor fprintf. Dus bijvoorbeeld
C:
1
fprintf(pTempFile, "%d", 2);

print het getal 2 naar de file. Voor meer uitleg hierover, zie een manual.
Als je echt de % moet hebben, doe je bij een fprintf normaal gesproken "%%" in je string. Voor jou is dit echter overkill. Ik vraag me sowieso af waarom je hier eerst de boel in een string zet. Beter lijkt me om het als volgt te doen:
C:
1
2
3
4
5
6
if( pTempFile = fopen(TempFile, "w"))
{
  while((c=getc(pSearchFile)) != EOF)
     fputc(c, pTempFile);
}
fclose(pTempFile);

[ Voor 6% gewijzigd door SWfreak op 12-02-2004 14:40 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

En mij lijkt het weer overkill om dat teken voor teken te doen, beter gebruik je gewoon fread () en fwrite () met een bepaalde buffergrootte (of eigenlijk std::fstream::read () en write (), aangezien het hier C++ betreft)

[ Voor 8% gewijzigd door .oisyn op 12-02-2004 14:48 ]

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.


  • McFizban
  • Registratie: Juli 2001
  • Laatst online: 27-05 19:59

McFizban

Hackito ergo sum.

En als je toch bezig bent met aanpassen:
Als je ook niet tekst bestanden (executables, plaatjes, etc.) wilt kopieren, let er dan ook op dat je de boel als een binaire file verwerkt.
Anders kun je gekke dingen tegen komen als er line break (\r\n) karakters in voor komen.

vervang:
C:
1
2
fopen(TempFile, "r")
fopen(TempFile, "w")

door:
C:
1
2
fopen(TempFile, "rb")
fopen(TempFile, "wb")

[ Voor 7% gewijzigd door McFizban op 12-02-2004 14:51 ]

Haardware: meuk die zo oud is dat het alleen nog nuttig is voor in de openhaard.


  • Da_Hardest
  • Registratie: November 2002
  • Laatst online: 09-08-2025

Da_Hardest

-= BrainB0ne =-

Topicstarter
hmmm, ja bedankt het werkt nu wel op jouw manier, maar de reden dat ik het eerst in een string wil zetten is dat de volgende stap is: een gedeelte in de string zoeken en vervangen door een andere string... ik moet namelijk gaan werken met HTML templates, ik wil een HTML Template inlezen in een string, vervolgens de string editen en erna weer terugschrijven naar een HTML file.

het moet een soort van HTML editor worden.. snappie? B)

ik wens mezelf nog veel succes toe haha :P

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

(of eigenlijk std::fstream::read () en write (), aangezien het hier C++ betreft)
Door dat soort opmerkingen komen mensen dus in de volstrekt foute veronderstelling dat je in C++ de STDC-functies niet zou mogen of kunnen gebruiken :/

Maar onder Windows moet je dan ook gewoon CopyFile of CopyFileEx gebruiken ipv dat omslachtige gemodder met STDC of STL functies... :Y)

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

curry684 schreef op 12 februari 2004 @ 15:02:
[...]

Door dat soort opmerkingen komen mensen dus in de volstrekt foute veronderstelling dat je in C++ de STDC-functies niet zou mogen of kunnen gebruiken :/
en door dit soort opmerkingen blijven mensen dus altijd de oude c functies gebruiken terwijl daar gewoon perfecte C++ implementaties voor bestaan (een std::iostream is generiek, een FILE * niet. Wat jij nu mensen aanleert is dat als ze een functie hebben die ergens data uit moeten extracten, dat zo'n functie dan altijd een FILE * of een string voor de filenaam als parameter heeft, en je dus altijd met files moet werken, ipv de eindeloze mogelijkheden mbv std::iostream) :{
curry684 schreef op 12 februari 2004 @ 15:02:
Maar onder Windows moet je dan ook gewoon CopyFile of CopyFileEx gebruiken ipv dat omslachtige gemodder met STDC of STL functies... :Y)
uhm ja
Da_Hardest schreef op 12 februari 2004 @ 14:21:
Hallo, ben pas met VC++ begonnen op mijn stageopdracht, ik ben aant testen hoe ik met file-IO moet omgaan
dat leert ie niet door gebruik te maken van kant en klare functies

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.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

.oisyn schreef op 12 februari 2004 @ 15:06:
[...]
en door dit soort opmerkingen blijven mensen dus altijd de oude c functies gebruiken terwijl daar gewoon perfecte C++ implementaties voor bestaan (een std::iostream is generiek, een FILE * niet. Wat jij nu mensen aanleert is dat als ze een functie hebben die ergens data uit moeten extracten, dat zo'n functie dan altijd een FILE * of een string voor de filenaam als parameter heeft, en je dus altijd met files moet werken, ipv de eindeloze mogelijkheden mbv std::iostream) :{
Je bedoelt dat ding met stukken minder mogelijkheden dan CreateFile, ReadFile, WriteFile, GetFileSize en CloseHandle?

Als je dan wil leren omgaan met file I/O onder Windows, pak dan de correcte API-calls :/
dat leert ie niet door gebruik te maken van kant en klare functies
Mjah ik zie het punt er niet in om iemand aan te leren 30 regels code voor te typen terwijl er een tig keer snellere OS-native standaardimplementatie van is.

Professionele website nodig?


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dude, z'n doel is niet files kopiëren, maar het leren van file IO

En vertel mij eens, kan ik ook een lees/schrijf handler in mijn programma implementeren die bijvoorbeeld data uitleest uit een stuk geheugen en dat decompressed, of bijvoorbeeld tekst schrijft naar een edit-box, zodat ik daarvoor handles kan gebruiken icm Read/WriteFile? En cut the crap met die :{ smiley, het komt nogal denigrerend over

[ Voor 7% gewijzigd door .oisyn op 12-02-2004 15:21 ]

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.


  • Da_Hardest
  • Registratie: November 2002
  • Laatst online: 09-08-2025

Da_Hardest

-= BrainB0ne =-

Topicstarter
niet ruzien hier ;) het is allemaal goed bedoeld :D

maar ik kwam op het idee om het op de omslachtige manier aan te pakken doordat ik dit =>> http://www.codeguru.com/cpp_mfc/SnR.html artikel las, alleen dit progje heeft ook het probleem dat ie de % tekens weglaat anders was dit wat ik zocht :)
ik laadde namelijk een HTML template in, veranderde een stuk in de string en opeens was de layout helemaal bagger, ik de 2 files vergeleken en de % tekens bij table width=80% enzo waren weg, het werd dus table width=80 wat er natuurlijk heel erg anders uitziet :(

dit moet toch te realiseren zijn lijkt me zo, ik moet namelijk iets hebben waarmee ik in een string kan zoeken en vervolgens dat stuk editen en weer wegschrijven naar een HTML file.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:00

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, gebruik fputs () ipv fprintf (), of je moet iets doen als fprintf ("%s", tekst);

Het komt omdat de eerste parameter van fprintf een speciale formatstring verwacht, en die parsed de % tekens erin. Je moet dus dus ook niet gebruiken om gewone strings weg te schrijven :)

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.


  • Da_Hardest
  • Registratie: November 2002
  • Laatst online: 09-08-2025

Da_Hardest

-= BrainB0ne =-

Topicstarter
.oisyn schreef op 12 februari 2004 @ 15:24:
Ja, gebruik fputs () ipv fprintf (), of je moet iets doen als fprintf ("%s", tekst);

Het komt omdat de eerste parameter van fprintf een speciale formatstring verwacht, en die parsed de % tekens erin. Je moet dus dus ook niet gebruiken om gewone strings weg te schrijven :)
_/-\o_ God bless you! _/-\o_

de gouden tip laten we maar zegge! :D geweldig, nu kan ik weer verder klooien :) jullie zullen me wel nog vaker horen hier ;)
Pagina: 1