Avatar billede fredag1 Nybegynder
24. januar 2006 - 11:30 Der er 5 kommentarer

Ændring i en fil

Jeg vil gerne ændre en fil's indehold som følgende:


streng                                          Resultat
1234 Erstatning                                  Erstatning
1235 $1234$ Ersatning                            Erstatning
1236 Prøv denne $1234$                    prøv denne erstatning
1237 $1236$ hvis du vil.        prøv denne erstatning hvis du vil
Avatar billede laffe Nybegynder
24. januar 2006 - 15:00 #1
Indlæs filen som tekst fil - linie for linie.

For hver linie, så fjerner du alle karakterer karakerer der der tal '0'..'9' og '$'

Den nye linie skriver du så ned i en ny tekst fil.
Avatar billede laffe Nybegynder
24. januar 2006 - 15:01 #2
Jeg prøver lige igen.

filen som tekst fil - linie for linie.

For hver linie, så fjerner du alle karakerer der er tal '0'..'9' og '$'

Den nye linie skriver du så ned i en ny tekst fil.
Avatar billede bertelbrander Praktikant
24. januar 2006 - 20:33 #3
Er denne linie ikke ulogisk:
1235 $1234$ Ersatning                            Erstatning

Bør det ikke blive:
1235 $1234$ Ersatning                            Erstatning Erstatning

Jeg prøver at lave en løsning
Avatar billede bertelbrander Praktikant
24. januar 2006 - 20:59 #4
Hvis vi ser bort fra 1235 kan dette bruges:

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

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

std::map <int, std::string> MyMap;

int main()
{
  std::ifstream F("test.dat");
  int i;

  while(F >> i)
  {
      std::string Text;
      F.ignore(1024, ' ');
      std::getline(F, Text);
      MyMap[i] = Text;
  }
  std::map <int, std::string>::iterator it;
  for(it = MyMap.begin(); it != MyMap.end(); ++it)
  {
      bool Parse;
      do
      {
        Parse = false;
        std::string T = it->second;
        std::string::size_type p1 = T.find('$');
        if(p1 != std::string::npos)
        {
            std::string::size_type p2 = T.find('$', p1 + 1);
            if(p2 != std::string::npos)
            {
              std::string N = T.substr(p1 + 1, p2 - p1 - 1);
              int idx;
              if(FromString(idx, N))
              {
                  std::map<int, std::string>::iterator repl = MyMap.find(idx);
                  if(repl != MyMap.end())
                  {
                    std::string Res = T.substr(0, p1);
                    Res += repl->second;
                    Res += T.substr(p2 + 1);
                    it->second = Res;
                    Parse = true;
                  }
              }
            }
        }
      }
      while(Parse);
  }
  for(it = MyMap.begin(); it != MyMap.end(); ++it)
  {
      std::cout << it->first << ", " << it->second << std:: endl;
  }
}
Avatar billede fredag1 Nybegynder
25. januar 2006 - 11:54 #5
Tak bertelbrander!
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

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