Toon posts:

[C++ / Borland] Variable filename voor ifstream

Pagina: 1
Acties:

Verwijderd

Topicstarter
Via een button haal ik eenbestandsnaam op die ik in moet gaan lezen. Deze naam komt eerst in een Edit te staan en daarna wordt deze omgezet naar een char* die dan met ifstream ingelezen wordt.

Probleem zijn alleen de "\". Doordat de bestandnaam uit "\" bestaat, wordt hij niet goed ingelezen.

Hoe kan ik de "\" omzetten naar "/" ?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(OpenDialog1->Execute())
        Edit1->Text = OpenDialog1->FileName;
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        char* FileNameKNB1 = Edit1->Text.c_str();

        Regel = "Reading files...";
        RichEdit1->Lines->Add(Regel);
        StatusBar1->Panels->Items[0]->Text = Regel;

        ifstream inOud(FileNameKNB1);


Die FileNameKNB1 pakt hij dus niet goed omdat die backslashes bevat ipv slashes.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik denk dat je probleem iets anders is. en zelfs je probleembeschrijving versta ik niet:
1) of je filenaam is "\" wat niet kan. verhelpen met "\" -> "/" zal evemin iets doen.
'\' is enkel een escape teken in C++ wanneer de string specifieert: "\"" is een string met inhoud "
en "\\" is er een met inhoud \. wanneer je echter in een textbox een \ typed staat in de string ook dit: \
2) je filenaam is juist, maar ergens anders doe je iets mis. in deze code kan ik echter niet meteen een oorzaak vinden. wat is de fout die je krijgt ?

ASSUME makes an ASS out of U and ME


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:03

Creepy

Tactical Espionage Splatterer

"pakt hij dus niet goed"... k.. wat gaat er precies mis dan? Krijg je een foutmelding? Is de filename wel een absoluut pad? Aangezien in Windows standaard de \ gebruikt wordt voor filenames e.d. lijkt het me niet dat het daar aan ligt.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Even extra info:
Ik lees eerst een bestand in, splits deze en schrijf weg naar een ander bestand genaamd oud.xml.

Als ik een absoluut pad opgeef.... ifstream inOud("C:\csv2xml\files\KNB1"); Dan maakt hij oud.xml aan maar zonder inhoud.
Als ik absoluut pad ifstream inOud("C:/csv2xml/files/KNB1"); opgeef (dus met "/" ipv "\") dan maakt hij ook oud.xml aan maar dan wel met de goede inhoud.

Dan lijkt me toch dat er iets met die slashes is. Helaas geeft niets een foutmelding. Die kan ik dus ook niet laten zien.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

\ is een escape karakter. Als je die letterlijk in je string wil zetten, dan moet je hem twee keer intikken:
C++:
1
ifstream inOud("C:\\csv2xml\\files\\KNB1");

Zoals HIGHGuY dus als zegt. :P

[ Voor 9% gewijzigd door NMe op 12-11-2005 14:49 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
Dat is logisch ja. Maar mijn filename wordt bepaalt door een OpenDialog die in een Edit geplaatst wordt.
Hoe kan ik die AnsiString dan zo bewerken dat de backslashes of vervangen worden door slashes of dus ge-escaped worden?

Ik heb al lopen stoeien met de replace functie maar dat doet hij niet met AnsiStringen, daarna heb ik ook al geprobeerd om de AnsiString om te zetten naar een string, maar helaas, ook dat wilde niet.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:03

Creepy

Tactical Espionage Splatterer

Help -> Index -> String Functions o.i.d.. Borland C++ Builder heeft een hele mooie Help functie. Er zijn zelfs speciale ansi string functies en ook die staan in de help genoemd. En ja, daar zit ook een replace functie bij.

Lees ook aub de P&W FAQ - De "quickstart" eens goed door want je bent nog steed erg karig met je informatie (dus wat heb je nu precies geprobeerd? Wat gaat daar nu precies mee mis? etc. Melden als "dat pakt hij niet", "hij wilde niet", "hij doet het niet" zeggen echt helemaal niks);

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

zoals je uit m'n vorige reply al kan halen:
- enkel als je in C++ een string hard-codeert heb je \ als escape karakter.
- wanneer je een openfile-dialog gebruikt, is je string die je terug krijgt juist, en heb je geen escaping meer nodig.

reden:
als je bvb een " in een string wil (vb: char* zin = "jan zei:" ik heb het gezegd""), dan kan de C++ parser geen onderscheid maken tussen de aanhalingstekens binnen de string en die aanhalingstekens die de string in de C++ taal afbakenen. daarom gebruikt men \ als escape teken: het daarop volgende teken heeft (binnen C++ en binnen een string literal) een aparte betekenis.
gevolg daarvan is dat \ zelf niet meer letterlijk kan getyped worden. oplossing ? \ escapen zodat je krijgt:
char* plaats = "c:\\foo\\bar.xml"

wanneer die broncode gecompileerd wordt, komt die string literal in je executable te staan (je moet AnalogX textscan maar es downloaden) en staat er dan ook letterlijk "c:\foo\bar.xml" en niet "c:\\foo\\bar.xml".

zo ook bij invoer in een tekstvak. het \ teken heeft geen enkele speciale betekenis dus je krijgt ook letterlijk 1 \ teken in je string die de betekenis heeft die jij em geeft.

je probleem is dus waarschijnlijk niet \ gerelateerd, tenzij je hetgeen ik hier loop te vertellen aan je laars hebt gelapt.

[ Voor 4% gewijzigd door H!GHGuY op 12-11-2005 16:08 ]

ASSUME makes an ASS out of U and ME


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zaterdag 12 november 2005 @ 14:54:
Dat is logisch ja. Maar mijn filename wordt bepaalt door een OpenDialog die in een Edit geplaatst wordt.
Hoe kan ik die AnsiString dan zo bewerken dat de backslashes of vervangen worden door slashes of dus ge-escaped worden?
De escape sequences zijn om aan de compiler aan te geven dat je een speciaal character bedoelt in een string literal. De compiler zet het om naar de juiste string, en je applicatie heeft er geen idee van dat jij escape sequences gebruikt hebt. Je hoeft dus niet tijdens de loop van je applicatie nog eens characters te gaan escapen; een ifstream snapt daar namelijk helemaal niets van.

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.


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

.oisyn schreef op zaterdag 12 november 2005 @ 17:18:
Je hoeft dus niet tijdens de loop van je applicatie nog eens characters te gaan escapen; een ifstream snapt daar namelijk helemaal niets van.
hij wil een filename gebruiken om de ifstream te openen, dan is het wel handig om het e.e.a. te escapen hoor ;)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat moet je dan in hemelsnaam gaan escapen?

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.


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

C++:
1
2
3
std::fstream nick_old;
 // old stuff
nick_old.open("sirv/nick.db",iostream::binary|iostream::in);

Ik zie wel een kanshebber ? :P Tenminste, als je een stom OS als windows gebruikt natuurlijk, linux heeft nergens last van O-)

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zie nog steeds niet wat je moet escapen.

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ik denk dat de TS een ander probleem heeft dan hij beschrijft. De enige plek in Windows waar je de \ nodig hebt is de command line; de API accepteert ook een / als separator.Bovendien hoef je alleen literals te escapen, en string variabelen niet (zoals HIGHGuY meteen al opmerkte)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Ik had dus wel degelijk een probleem met escapen.
Moto-moi heeft inderdaad gelijk dat ik die filename die ik via een opendialog selecteer moest escapen, omdat er anders gewoon niets gebeurde wat ik ook al aangegeven had door ze hardcoded op 3 verschillende manieren uit te proberen.

De oplossing die ik nu heb is:
code:
1
2
3
4
5
6
7
8
AnsiString newFile = Edit1->Text;
newFile = StringReplace(newFile, "\\", "/", TReplaceFlags() << rfReplaceAll);

char* FileNameKNB1 = newFile.c_str();

ifstream inOud(FileNameKNB1);

....

En dit werkt perfect!
Ik heb me wel kapot lopen zoeken om die replace functie werkend te krijgen, maar gelukt dus!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Denkfout: als je het vergelijkt met hardcoded, dan vergelijk je variabelen met string literals. Die hebben toch echt andere escape regels.

Oh, en .c_str geeft geen char* terug.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zondag 13 november 2005 @ 10:26:
Moto-moi heeft inderdaad gelijk dat ik die filename die ik via een opendialog selecteer moest escapen,
Moto-moi heeft helemaal niet gelijk, en waar jij het over hebt is niet escapen maar een \ vervangen door een /. De runtime zou beide slashes moeten accepteren, als dat niet het geval is vraag ik me af of je wel met de standaard runtime werkt, of een 3rd party standard library gebruikt die een \ niet accepteert.

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.


  • schoene
  • Registratie: Maart 2003
  • Laatst online: 17:09
MSalters schreef op zondag 13 november 2005 @ 13:06:
Oh, en .c_str geeft geen char* terug.
dat doet AnsiString wel hoor

Verwijderd

Topicstarter
Het probleem is op op te lossen met 2 dingen. Ofwel de"\" escapen zodat het "\\", of de "\" vervangen door een "/".
Dit heb ik allebei uitgetest en werkt allebei.

En inderdaad een AnsiString kan je wel zo omzetten naar een char* 8)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik snap het niet.

je werkt niet met een string literal in de C++ code. waarom zou je dan moeten gaan escapen ?

escapen is enkel nodig om de COMPILER ervan op de hoogte te brengen dat eht volgende teken letterlijk moet geinterpreteerd worden. At runtime kan en mag escapen gewoon niet bestaan.

ASSUME makes an ASS out of U and ME


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 24-04 11:12

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap ook echt niet waarom het nou zulke problemen oplevert. Kan iemand met wél verstand van zaken eens uittesten wat er dan precies in die AnsiString komt te staan, en waarom het dan fout gaat? :)

[ Voor 5% gewijzigd door .oisyn op 15-11-2005 15:13 ]

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.

Pagina: 1