Avatar billede fedtoere Praktikant
07. december 2004 - 18:10 Der er 17 kommentarer og
1 løsning

konvertering af Ansi string til char

Mit problem består i at jeg ønsker at skrive indholdet af et "edit" felt ud i en fil.
Compileren jeg benytter er Borland Builder 5.0

Jeg ønsker at skrive i en fil i stil med:
outfile << "bla bla bla...." << endl;

Men indholdet af et Edit felt er en Ansi string, så hvordan får jeg den skrevet i min fil ?

outfile << Edit2->Text; // virker ikke, skal konverteres.

Hvordan konverterer jeg indholdet af mit edit felt til en char som jeg kan skrive direkte i min output fil ?

mvh
fedtoere
Avatar billede mcgoat Nybegynder
07. december 2004 - 18:11 #1
Edit2->Text.c_str()
Avatar billede mcgoat Nybegynder
07. december 2004 - 18:15 #2
outfile << Edit2->Text.c_str(); må det jo så blive... :)
Avatar billede fedtoere Praktikant
07. december 2004 - 18:42 #3
Jeg må lige have lidt mere hjælp.

Jeg har en global variabel

    char *direktoriestring_char;



Så har jeg en en funktion ved knap-event:

    void __fastcall TForm1::Button_drev_opdaterClick(TObject *Sender)
    {
      String drev_adskilling;

      drev_adskilling = "\:\\";
      direktoriestreng = Edit2->Text;
      direktoriestreng = direktoriestreng + drev_adskilling + Edit3->Text;
      direktoriestring_char = Edit2->Text.c_str();
    }


Så har jeg en andet knap event der kalder en funktion med bla følgende indhold:

    outfile << direktoriestring_char;


I min outputfil kommer der kun til at blive skrevet for ovenstående:



Det ser med andre ord ud til at det ikke er indholdet af pointeren jeg får skrevet, er der en åbenlys fejl i min kode ?
Avatar billede arne_v Ekspert
07. december 2004 - 18:57 #4
Jeg tror at det du sætter direktoriestring_char til at pege på er gået ud af scope.
Avatar billede arne_v Ekspert
07. december 2004 - 18:57 #5
Prøv:

char direktoriestring_char[1000];

og

strcpy(direktoriestring_char, Edit2->Text.c_str());
Avatar billede mcgoat Nybegynder
07. december 2004 - 19:09 #6
hvad præcis bruger du drev_adskilling til? er Edit2->Text f.eks D? hvis det er D drevet? for så kommer strengen vel til at se sådan ud? D\:\\ og ikke D:\\ ???
Avatar billede fedtoere Praktikant
07. december 2004 - 19:20 #7
Direktoriestring_char går vel ikke ud af scope når det er en global variabel, eller ?

Mit output i direktoriesting bliver f.eks:  "D:\temp"
Edit2 = "E" og Edit3 = "temp", det virker fint nok (jeg skriver det i et labelfelt).

Jeg prøver forslag om string copy senere i aften, har desværre ikke tid før :-(
Avatar billede mcgoat Nybegynder
07. december 2004 - 19:23 #8
Edit2 = "E" , drev_adskilling = "\:\\" og Edit3 = "temp"
bliver det så ikke?:
E\:\\temp ?
Avatar billede mcgoat Nybegynder
07. december 2004 - 19:24 #9
eller.. ahh... nåhh ja... betyder jo bare at den ikke skal "gøre" noget med den næste... hehe
Avatar billede arne_v Ekspert
07. december 2004 - 19:43 #10
Direktoriestring_char går ikke ud af scope, men det den peger på kan godt gøre det !
Avatar billede arne_v Ekspert
07. december 2004 - 19:44 #11
Jeg er heller ikke overbevist om at de \ er rigtige, men det er ikke dem som laver den
firkant !
Avatar billede arne_v Ekspert
07. december 2004 - 19:55 #12
Som eksempel se f.eks. følgende eksempel:

#include <stdio.h>


int *p;

void f()
{
  int v = 123;
  p = &v;
}

void f2()
{
  int v = 456;
}

int main()
{
  f();
  printf("%d\n",*p);
  f2();
  printf("%d\n",*p);
  return 0;
}

Som med GCC 3.1 og MS VC++ 6 uden switches outputter:

123
456

Det er naturligvis helt udefineret hvad den skal udskrive, da det p peger på
jo er gået ud af scope.
Avatar billede fedtoere Praktikant
07. december 2004 - 22:54 #13
Hej igen.

Jeg har lige lavet et lille check program hvor jeg har lagt hele koden i en enkelt knap event, så virker både udskrift fra label og edit felter.

    outfile << Edit1->Text.c_str() << endl;      /* virker */
    outfile << Label1->Caption.c_str() << endl;  /* virker */

Det tyder helt klart på at du har ret Arne, min variabel er ude af scope.

Mht mine "\", de virker helt perfekt, "\\" er jo en escape sequence.
Det betyder at "\\" giver en enkelt backslash som output. Ligesom "\a" giver en lyd, "\n" = newline, "\"" = " osv.

Jeg prøver lige string copy funktionen i min oprindelige kode.

Hvis jeg får det til at virke kan jeg så give jer begge to 30 point, eller kan jeg kun give poing til det ene svar (alle andre er jo kommentarer)?
Avatar billede arne_v Ekspert
07. december 2004 - 22:56 #14
Jeg ved godt at \\ giver en \.

Det er \: jeg ikke forstår.
Avatar billede arne_v Ekspert
07. december 2004 - 22:57 #15
Jeg kan godt ligge et svar
Avatar billede fedtoere Praktikant
07. december 2004 - 23:18 #16
Den "gamle" Ansi-C strcpy samt char x[100] erklæringen gør det hele :-)

I skal have mange tak begge to, jeg forsøger at give jer 30 point hver.

PS "\:" kan jeg godt forstå du ikke forstår, faktisk er den unødvendig, men bliver åbenbart opfattet som en escape seq alligevel, der er ingen forskel på mit output ligegyldigt om jeg benytter "\:\\" eller ":\\"
Avatar billede fedtoere Praktikant
07. december 2004 - 23:36 #17
Øjensynligt er det ikke muligt at give 30 point til jer begge, Arne jeg laver et nyt spørgsmål der hedder "strcpy point til Arne", hvis du svarer på dette så får du point der.
Avatar billede arne_v Ekspert
07. december 2004 - 23:38 #18
Jeg mener at man først skal øge point antallet og så markere begge navne inden man
klikker accepter.

Men det andet er jo lige så godt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester