Avatar billede bentblod Nybegynder
06. januar 2005 - 01:33 Der er 20 kommentarer og
1 løsning

Ang Parsing

Hej er lidt ny til c++, og mangler lidt viden om parsing.

Hvordan får jeg en string til at blive en char[] ?

Hvordan får jeg et tal i string til at blive int,float,double?

Og til sidst hvordan får jeg hevet ting ud af denne sætning ind i nogle variabler: Bil,200,230.23 ?
Avatar billede bertelbrander Novice
06. januar 2005 - 02:01 #1
#include <string>
#include <sstream>

template <typename T>
bool FromString(T &aRes, const std::string &aStr)
{
  std::stringstream ss(aStr);
  return ss >> aRes;
}

int main()
{
  std::string y = "Ole Nielsen";
  char *x = new char[y.size() + 1];
  strcpy(x, y.c_str());
  char v[1025]; // nok er nok
  strcpy(v, y.c_str());
  delete [] x;

  std::string t("123");
  int i;
  FromString(i, t);

  double d;
  FromString(d, t);
}
Avatar billede bentblod Nybegynder
06. januar 2005 - 02:08 #2
hmm ok vil jeg lige kigge på, men glemte også at spørger hvordan man får en char tilbage til en string? :)
Avatar billede bertelbrander Novice
06. januar 2005 - 02:09 #3
#include <string>
#include <sstream>
#include <iostream>

std::string Split(std::string &aSrc, char aDelim)
{
  if(aSrc.empty())
      return "";
  std::string::size_type pos = aSrc.find(aDelim);
  std::string T = aSrc.substr(0, pos);
  if(pos != std::string::npos)
    aSrc = aSrc.substr(pos + 1);
  else
    aSrc = "";
  return T;
}

int main()
{
  std::string Test = "Bil,200,230.23";
  std::string Sub;
  while(!(Sub = Split(Test, ',')).empty())
    std::cout << Sub << std::endl;
}
Avatar billede bentblod Nybegynder
06. januar 2005 - 02:09 #4
Thx :) men btw gider du ikke også lige skrive nogle forklaringer på? Jeg er rimelig newbie til det her c++ og lære det nok hurtigst hvis jeg får at vide hvad der sker :)
Avatar billede bertelbrander Novice
06. januar 2005 - 02:09 #5
char Test[123] = "Niels Jensen";
std::string Yrsa = Test;
Avatar billede bertelbrander Novice
06. januar 2005 - 02:15 #6
Oprette et dynamisk array, af samme størrelse som std::string'en y, plus plads til nulterminering:
char *x = new char[y.size() + 1];

Et fixed størrelse array, skal være stort nok:
char v[1025]; // nok er nok

Nedlægger det dynamiske array igen efter brug:
delete [] x;

FromString læser std::string'en ud i en stringstream, hvorfra man kan stream'e en int, double, whatever, på samme måde som fra tastaturet eller en fil. FromString returnerer true hvis man kunne konvertere.

Split splitter input op ved , bemærk at indput bliver ødelagt ved operationen.
Avatar billede bertelbrander Novice
06. januar 2005 - 02:15 #7
Og godnat.
Avatar billede bentblod Nybegynder
06. januar 2005 - 14:40 #8
Ok nu har jeg siddet og rodet lidt med det, alt det med at parse virker fint nok, mangler så stadig at kigge på det med split, men har et problem i denne metode:

  std::string y = "Ole Nielsen";
  char *x = new char[y.size() + 1];
  strcpy(x, y.c_str());
  char v[1025]; // nok er nok
  strcpy(v, y.c_str());
  delete [] x;

der hvor du siger char v[1025]; skaber problemer, da det er meningen at det er noget der skal skrives til en fil. Men hvis man bare siger 1025 så laver den en masse underlige tegn efter man har skrevet det ned til filen. Jeg prøvede så at sige char v[y.size() + 1]; istedetfor men kunne jeg ikke få lov til åbenbart, hvordan løser jeg det problem?
Avatar billede bertelbrander Novice
06. januar 2005 - 20:02 #9
Hvordan skriver du til filen?
Hvorfor vil du have det konverteret til en char []?

Normalt ville man bare udskrive med:
std::ofstream out("test.dat");
std::string foo = "Niels Poulsen";
out << foo;

og læse med
std::ifstream in("test.dat");
std::string foo;
in >> foo;
Avatar billede bentblod Nybegynder
06. januar 2005 - 21:36 #10
Bare i følge min newbie bog, der siger den man skal gøre det med char :)
Avatar billede bentblod Nybegynder
06. januar 2005 - 21:39 #11
i følge den gør man sådan her:

void Filhaandtering::skrivTilFil(char text[], int size){
  pFile = new ofstream("c:\\tekstfil.txt");
  pFile->write(text,size);
  pFile->close();
  delete pFile;
}
Avatar billede bertelbrander Novice
06. januar 2005 - 22:52 #12
Du burde kunne skrive en streng med:
Filhaandtering Fil;
std::string Whatever = "POP";
Fil.skrivTilFil(Whatever.c_str(), Whatever.size());

Du skal dog ændre funktionen til:
void Filhaandtering::skrivTilFil(const char text[], int size){

Men det er lettere at bruge <<

Hvordan siger din bog at du skal læse ?
Hvad er det for en bog ?
Avatar billede bentblod Nybegynder
06. januar 2005 - 23:07 #13
Hmm det brokker den sig over:

bcc32 -D_DEBUG -g100 -j25 -Od -r- -k -y -v -vi- -tWC -c -IC:\CBuilderX\include  -n"D:\c++ programmering\basic\windows\Debug_Build"  controller.cpp filhaandtering.cpp
Borland C++ 5.6.4 for Win32 Copyright (c) 1993, 2002 Borland
controller.cpp:
"controller.cpp": E2034 Cannot convert 'const char *' to 'char *' in function Controller::skrivTilFil(char *,int) at line 12
"controller.cpp": E2342 Type mismatch in parameter 'text' (wanted 'char *', got 'const char *') in function Controller::skrivTilFil(char *,int) at line 12
"controller.cpp": W8057 Parameter 'text' is never used in function Controller::skrivTilFil(char *,int) at line 14
"controller.cpp": W8057 Parameter 'size' is never used in function Controller::skrivTilFil(char *,int) at line 14
*** 2 errors in Compile ***
filhaandtering.cpp:
"filhaandtering.cpp": E2316 'Filhaandtering::skrivTilFil(const char * const,int)' is not a member of 'Filhaandtering' at line 8
"filhaandtering.cpp": E2206 Illegal character '\' (0x5c) at line 9
"filhaandtering.cpp": E2206 Illegal character '\' (0x5c) at line 9
*** 3 errors in Compile ***
BCC32 exited with error code: 1
Build cancelled due to errors

bogen hedder: Grundlæggende programmering i c++ af Henrik Tange
Avatar billede bertelbrander Novice
06. januar 2005 - 23:12 #14
Du skal ændre både funktionen og prototypen i class'en (dvs tilføje const i class'en)

Jeg er ikke imponeret over bogen.
Avatar billede bertelbrander Novice
06. januar 2005 - 23:14 #15
Hvad står der i filhaandtering.cpp linie 9?
Avatar billede bentblod Nybegynder
06. januar 2005 - 23:15 #16
Ok, har du et forslag til andre nybegynder bøger?? Men virker nu :)
Avatar billede bertelbrander Novice
06. januar 2005 - 23:21 #17
Jeg har aldrig læst en C++ bog, så jeg har svært ved at anbefale en.
Jeg læste ca. 100 sider i Bjarne Stroustrup's bog, men gik så kold.

Funktionen fra før burde se sådan ud:

void Filhaandtering::skrivTilFil(const char text[], int size){
  ofstream File("c:\\tekstfil.txt");
  File.write(text,size);
}

Så sker der ikke ubehagelige ting hvis der kastes en exception.
Der bør dog nok laves en check for om filen kunne åbnes og at der kunne skrives.
Avatar billede bentblod Nybegynder
06. januar 2005 - 23:24 #18
ok mange tak for hjælpen :) Kommer sikkert en masse andre newbie spørgsmål du kan svare på hehe :) Bare skriv som svar :)
Avatar billede bertelbrander Novice
06. januar 2005 - 23:26 #19
Jeg har også kikket lidt i denne:
http://archive.devx.com/free/books/bookview.asp?content_id=1853

Men den er ikke for begyndere.
Avatar billede bertelbrander Novice
06. januar 2005 - 23:29 #20
Jeg har også bladret lidt i denne:
http://risk-management.argospress.com/book-0201379260.htm

Jeg samler stadig ikke på point.
Avatar billede bentblod Nybegynder
06. januar 2005 - 23:31 #21
Ok tak, vil kigge lidt på dem så :)
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