Avatar billede ulrikhjul Nybegynder
02. april 2006 - 17:42 Der er 5 kommentarer

Parsing af fil 2

Hej.
Jeg prøver på at pille nogle bestemte ting ud af en *.txt fil der ser ud som følger:

Brugernavn: tullepige
Email adresse: tullepige@hotmail.com
Pris: 185,00 DKK ( x 2)
Finn Jensen
østrevej 3a 2th
8000 Århus C
75659797

Jeg skal bruge:

tullepige
tullepige@hotmail.com
185.00
2
Finn Jensen
østrevej 3a 2th
8000
Århus C
75659797

Og alle skal bruges som strenge senere i programmet pånær 185.00 og 2 - de skal være som int's.

Nu er mit problem  imellem "Navn" (Finn Jensen) og "Adresse1" (østrevej 3a 2th).

Jeg kan godt lægge "Navn" i en char, men når jeg prøver at lægge "Adresse1" i en char, kan jeg ikke undgå, at "Navn" kommer med en gang til.

Jeg synes egentlig at det burde være let, for det hele kører i en løkke, der processerer een linie hver gang den kører.

Koden: (Blot mit nuværende forsøg - jeg har prøvet MANGE ting.)
*******************************************

Email = strstr (linie,"Email adresse: ");
Brugernavn = strstr (linie,"Brugernavn: ");
Pris = strstr (linie,"Pris: ");
    if( Email != linie && Brugernavn != linie && Pris != linie && c == 1 )
    {   
        Navn = linie;
        cout << Navn << ";" << endl;
       
        c++;
    }   

Email = strstr (linie,"Email adresse: ");
Brugernavn = strstr (linie,"Brugernavn: ");
Pris = strstr (linie,"Pris: ");
      if(  Email != linie && Brugernavn != linie && Pris != linie && Navn != NULL )
        {
            Navn = linie;
            int filesize1 = atoi(Navn);
            int filesize2 = atoi(linie);
            int filesize3 = filesize2 -= filesize1;
            Adresse1 = Navn += filesize3;
            cout << Adresse1 << ";" << endl;
        }   
   

*******************************************************
Hvordan gør man det - det er for mig som om at pointeren ikke kan flyttes frem fra "Navn". Nok bare mig der er dum....! :-)
Avatar billede ulrikhjul Nybegynder
02. april 2006 - 17:45 #1
Jeg kan godt se at mit nuværende forsøg ikke er realistisk, da det jo som sagt er i en løkke, og da filesize3 så vil blive 0, da Navn og linie vil være det samme....
Avatar billede ulrikhjul Nybegynder
02. april 2006 - 17:46 #2
men jeg håber at meningen om hvad jeg gerne vil træder frem....
Avatar billede arne_v Ekspert
02. april 2006 - 22:56 #3
lidt inspiration:

#include <stdio.h>
#include <string.h>

#define BRUGERNAVN "Brugernavn: "
#define EMAILADRESSE "Email adresse: "
#define PRIS "Pris: "

int main()
{
    FILE *fp;
    char linie[80],brugernavn[80],emailadresse[80];
    int pris,antal;
    fp = fopen("test.txt", "r");
    while(fgets(linie,sizeof(linie),fp))
    {
        if(linie[strlen(linie)-1]=='\n') linie[strlen(linie)-1]='\0';
        if(strstr(linie,BRUGERNAVN)==linie)
        {
            strcpy(brugernavn, linie+strlen(BRUGERNAVN));
            printf("brugernavn=%s\n",brugernavn);
        }
        else if(strstr(linie,EMAILADRESSE)==linie)
        {
            strcpy(emailadresse, linie+strlen(EMAILADRESSE));
            printf("emailadresse=%s\n",emailadresse);
        }
        else if(strstr(linie,PRIS)==linie)
        {
            sscanf(linie,"Pris: %d,00 DKK ( x %d)",&pris,&antal);
            printf("pris=%d antal=%d\n",pris,antal);
        }
        else
        {
            printf("anden linie=%s\n",linie);
        }
    }
    fclose(fp);
    return 0;
}
Avatar billede bertelbrander Novice
02. april 2006 - 23:26 #4
En noget anderledes løsning:

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

struct DataType
{
  std::string User;
  std::string Email;
  double Price;
  int Nr;
  std::string Name;
  std::string Address;
  std::string PostNr;
  std::string City;
  std::string PhoneNr;
};

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

bool ReadData(std::istream& aFile, DataType& aData)
{
  std::string Temp;
  std::string::size_type Pos;

  if(!std::getline(aFile, Temp))
      return false;
  if((Pos = Temp.find(':')) == std::string::npos)
      return false;
  aData.User = Temp.substr(Pos + 2);

  if(!std::getline(aFile, Temp))
      return false;
  if((Pos = Temp.find(':')) == std::string::npos)
      return false;
  aData.Email = Temp.substr(Pos + 2);

  if(!std::getline(aFile, Temp))
      return false;
  if((Pos = Temp.find(':')) == std::string::npos)
      return false;

  FromString(aData.Price, Temp.substr(Pos + 2));

  if((Pos = Temp.find('x')) == std::string::npos)
      return false;

  FromString(aData.Nr, Temp.substr(Pos + 1));

  if(!std::getline(aFile, aData.Name))
      return false;

  if(!std::getline(aFile, aData.Address))
      return false;

  if(!std::getline(aFile, Temp))
      return false;

  if((Pos = Temp.find(' ')) == std::string::npos)
      return false;
    aData.PostNr = Temp.substr(0, Pos);
    aData.City = Temp.substr(Pos + 1);

  if(!std::getline(aFile, aData.PhoneNr))
      return false;

  return true;
}

int main(int argc, char *argv[])
{
  std::ifstream File(argv[1]);
  if(!File)
  {
      std::cerr << "Failed to open input file" << std::endl;
      return 0;
  }
  DataType Data;
  if(ReadData(File, Data))
  {
      std::cout << "User: " << Data.User << std::endl;
      std::cout << "Email: " << Data.Email << std::endl;
      std::cout << "Price: " << Data.Price << std::endl;
      std::cout << "Nr: " << Data.Nr << std::endl;
      std::cout << "Name: " << Data.Name << std::endl;
      std::cout << "Address: " << Data.Address << std::endl;
      std::cout << "PostNr: " << Data.PostNr << std::endl;
      std::cout << "City: " << Data.City << std::endl;
      std::cout << "PhoneNr: " << Data.PhoneNr << std::endl;
  }
}
Avatar billede arne_v Ekspert
19. juni 2006 - 01:54 #5
tid at få afsluttet her ?
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