Wątek przeniesiony 2016-03-15 12:05 z C/C++ przez ŁF.

Duplikowanie zapisywanej tresci w pliku

0

Ogolnie rzecz biorac program ma edytowac strone html
plik wizytowka.html jest plikiem końcowym
Najpierw do wizytowka.html jest przepisywana tresc 1.txt
nastepnie do memb.txt wczytywana jest tresc temp.txt gdzie w trakcie tego niektore linie sa podmienione na zmienne
po czym z memb.txt wstawione juz w szblon informacje do wizytowka.html (i tutaj zaczynaja sie dziwne rzeczy bo jesli wprowadzam 1osobe to wypisuje jedna; jesli 2 to wypisuje mi pierwsza, druga, druga; jesli sa to 3 osoby to pierwsza, druga, druga, trzecia, druga, trzecia i tak dalej...)
Na koniec przepisywana jest tresc 3.txt do wizytowka.html

Nie wiem co jest nie tak, a raczej jak zrobić program wypisywal kazda osobe tylko raz a nie kilku krotnie w losowej kolejnosci

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;

int main()
{
    string linia;
    int nr_linii=1, wpro;

    cout<<"Ile osob chcesz wprowadzic: "; cin>>wpro;

    string nazwisko[wpro], mail[wpro], imie[wpro], sciezka[wpro];
    int nr_tel[wpro];

    fstream plik4;
    plik4.open("wizytowka.html", ios::out);

    if(plik4.good()==false)
    {
        cout<<"Plik koncowy nie istnieje...!";
        exit(0);
    }

    fstream plik1;
    plik1.open("1.txt", ios::in);

    if(plik1.good()==false)
    {
        cout<<"Plik head nie istnieje...!";
        exit(0);
    }

    while(getline(plik1, linia))
    {
        switch (nr_linii)
        {
            case 1: linia;          break;
            case 2: linia;          break;
            case 3: linia;          break;
            case 4: linia;          break;
            case 5: linia;          break;
            case 6: linia;          break;
            case 7: linia;          break;
            case 8: linia;          break;
            case 9: linia;          break;
            case 10: linia;         break;
            case 11: linia;         break;
            case 12: linia;         break;
            case 13: linia;         break;
            case 14: linia;         break;
            case 15: linia;         break;
            case 16: linia;         break;
            case 17: linia;         break;
            case 18: linia;         break;
            case 19: linia;         break;
            case 20: linia;         break;
            case 21: linia;         break;
            case 22: linia;         break;
            case 23: linia;         break;
            case 24: linia;         break;
            case 25: linia;         break;
            case 26: linia;         break;
            case 27: linia;         break;
            case 28: linia;         break;
            case 29: linia;         break;
            case 30: linia;         break;
            case 31: linia;         break;
            case 32: linia;         break;
            case 33: linia;         break;
            case 34: linia;         break;
            case 35: linia;         break;
            case 36: linia;         break;
            case 37: linia;         break;
            case 38: linia;         break;
        }
        nr_linii++;
        plik4<<linia<<endl;
    }

    plik1.close();

    for( int ii=0; ii<wpro; ii++)
    {
    fstream plik;
    plik.open("memb.txt", ios::out | ios::app);

    if(plik.good()==false)
    {
        cout<<"Plik z danymi nie istnieje...!";
        exit(0);
    }

    fstream plik2;
    plik2.open("temp.txt", ios::in);

    if(plik2.good()==false)
    {
        cout<<"Plik z szblonem nie istnieje!";
        exit(0);
    }

        nr_linii=1;
        cout<<"Podaj imie nr"<<ii+1<<": ";
        cin>>imie[ii];
        cout<<"Podaj nazwisko nr"<<ii+1<<": ";
        cin>>nazwisko[ii];
        cout<<"Podaj nr_tel"<<ii+1<<": ";
        cin>>nr_tel[ii];
        cout<<"Podaj mail nr"<<ii+1<<": ";
        cin>>mail[ii];
        while(getline(plik2, linia))
        {
            switch (plik2, nr_linii)
            {
                case 1: linia;              break;
                case 2: linia;              break;
                case 3: linia;              break;
                case 4: linia;              break;
                case 5: linia;              break;
                case 6: linia;              break;
                case 7: linia=imie[ii];      break;
                case 8: linia;              break;
                case 9: linia;              break;
                case 10: linia=nazwisko[ii]; break;
                case 11: linia;             break;
                case 12: linia;             break;
                case 13: linia=nr_tel[ii];   break;
                case 14: linia;             break;
                case 15: linia;             break;
                case 16: linia=mail[ii];     break;
                case 17: linia;             break;
                case 18: linia;             break;
                case 19: linia;             break;
            }
            nr_linii++;
            plik<<linia<<endl;
        }
    plik2.close();
    plik.close();



    plik.open("memb.txt", ios::in);

    if(plik.good()==false)
    {
        cout<<"Plik z danymi nie istnieje...!";
        exit(0);
    }
        nr_linii=1;
        while(getline(plik, linia))
        {
            switch (plik, nr_linii)
            {
                case 1: linia;              break;
                case 2: linia;              break;
                case 3: linia;              break;
                case 4: linia;              break;
                case 5: linia;              break;
                case 6: linia;              break;
                case 7: linia=imie[ii];     break;
                case 8: linia;              break;
                case 9: linia;              break;
                case 10: linia=nazwisko[ii];break;
                case 11: linia;             break;
                case 12: linia;             break;
                case 13: linia=nr_tel[ii];  break;
                case 14: linia;             break;
                case 15: linia;             break;
                case 16: linia=mail[ii];    break;
                case 17: linia;             break;
                case 18: linia;             break;
                case 19: linia;             break;
            }
            nr_linii++;
            plik4<<linia<<endl;
            }
            plik.close();
        }


    fstream plik3;
    plik3.open("3.txt", ios::in);

        if(plik3.good()==false)
    {
        cout<<"Plik footer nie istnieje...!";
        exit(0);
    }

    while(getline(plik3, linia))
    {
        switch (nr_linii)
        {
            case 1: linia; break;
            case 2: linia; break;
            case 3: linia; break;
            case 4: linia; break;
            case 5: linia; break;
            case 6: linia; break;
            case 7: linia; break;
        }
        nr_linii++;
        plik4<<linia<<endl;
    }
    plik3.close();
    plik4.close();
    return 0;
}
0

z tego co wypatrzyłem:

 
cout<<"Ile osob chcesz wprowadzic: "; cin>>wpro;
 
    string nazwisko[wpro], mail[wpro], imie[wpro], sciezka[wpro];
    int nr_tel[wpro];

błąd, rozmiar tablic statycznych można tylko podać jako CONST lub wartośc liczbowa. Przejdź na tablice dynamiczne lub vector.

 
switch (nr_linii)
        {
            case 1: linia;          break;
            case 2: linia;          break;
            case 3: linia;          break;
            case 4: linia;          break;
            case 5: linia;          break;
            case 6: linia;          break;
            case 7: linia;          break;
            case 8: linia;          break;
            case 9: linia;          break;
            case 10: linia;         break;
            case 11: linia;         break;
            case 12: linia;         break;
            case 13: linia;         break;
            case 14: linia;         break;
            case 15: linia;         break;
            case 16: linia;         break;
            case 17: linia;         break;
            case 18: linia;         break;
            case 19: linia;         break;
            case 20: linia;         break;
            case 21: linia;         break;
            case 22: linia;         break;
            case 23: linia;         break;
            case 24: linia;         break;
            case 25: linia;         break;
            case 26: linia;         break;
            case 27: linia;         break;
            case 28: linia;         break;
            case 29: linia;         break;
            case 30: linia;         break;
            case 31: linia;         break;
            case 32: linia;         break;
            case 33: linia;         break;
            case 34: linia;         break;
            case 35: linia;         break;
            case 36: linia;         break;
            case 37: linia;         break;
            case 38: linia;         break;
        }

Co wg Ciebie robi ten kod i wszystkie inne tego typu?

0

Dzięki, był bym bardzo wdzięczny jak byś miał jakiś poradnik warty polecenia odnośnie tych vektorów bądź całęgo c++

Ten kod

 while(getline(plik1, linia))
    {
        switch (nr_linii)
        {
            case 1: linia;          break;
            case 2: linia;          break;
            case 3: linia;          break;
            case 4: linia;          break;
            case 5: linia;          break;
            case 6: linia;          break;
            case 7: linia;          break;
            case 8: linia;          break;
            case 9: linia;          break;
            case 10: linia;         break;
            case 11: linia;         break;
            case 12: linia;         break;
            case 13: linia;         break;
            case 14: linia;         break;
            case 15: linia;         break;
            case 16: linia;         break;
            case 17: linia;         break;
            case 18: linia;         break;
            case 19: linia;         break;
            case 20: linia;         break;
            case 21: linia;         break;
            case 22: linia;         break;
            case 23: linia;         break;
            case 24: linia;         break;
            case 25: linia;         break;
            case 26: linia;         break;
            case 27: linia;         break;
            case 28: linia;         break;
            case 29: linia;         break;
            case 30: linia;         break;
            case 31: linia;         break;
            case 32: linia;         break;
            case 33: linia;         break;
            case 34: linia;         break;
            case 35: linia;         break;
            case 36: linia;         break;
            case 37: linia;         break;
            case 38: linia;         break;
        }
        nr_linii++;
        plik4<<linia<<endl;
    }
 

według mnie przepisuje kolejno 38 lini z plik1 do plik4
znaczy się pętla wykonuje się do momentu aż przepisze wszystkie istniejące linie
działając w następujący sposób
zaczynając od case 1 najpierw zawartość 1 nr_linii z plik1 jest wczytywana do zmiennej linia a nastepnie przepisywana do plik4 po czym nastepuje zwiększenie nr_linii o 1, kolejno zawartosc zmiennej linia zostaje nadpisana zawartoscia nr_linii o numerze na ktory zostala zwiekszona przy nr_lini++

0

@Laaste Czemu nie zamienisz ten kod na:

for(nr_linii=1;getline(plik1,linia);++nr_linii) plik4<<linia<<endl;

?
Zrobi dokładnie to samo.
Jeżeli nie potrzebujesz ilości wierszy w pliku, to wystarczy:

while(getline(plik1,linia)) plik4<<linia<<endl;
2

żaden z tych caseów nie robi zupełnie nic. Całego switcha można wywalić.

0

@_13th_Dragon
Masz racje 1 while wraz z switch moge bez problemu podmienic, ale z drugą petlą nie jest już tak prosto :/

while(getline(plik2, linia))
        {
            switch (plik2, nr_linii)
            {
                case 1: linia;              break;
                case 2: linia;              break;
                case 3: linia;              break;
                case 4: linia;              break;
                case 5: linia;              break;
                case 6: linia;              break;
                case 7: linia=imie[ii];      break;
                case 8: linia;              break;
                case 9: linia;              break;
                case 10: linia=nazwisko[ii]; break;
                case 11: linia;             break;
                case 12: linia;             break;
                case 13: linia=nr_tel[ii];   break;
                case 14: linia;             break;
                case 15: linia;             break;
                case 16: linia=mail[ii];     break;
                case 17: linia;             break;
                case 18: linia;             break;
                case 19: linia;             break;
            }
            nr_linii++;
            plik<<linia<<endl;
        }

Nie mniej jednak mój problem pozostaje nie rozwiązany - dalej występuje dziwne zwielokrotnienie przepisywania infromacji z memb.txt do wizytowka.html

0

Musisz zrozumieć jedną prostą rzecz, ten twój kod jest tak absurdalny że nikt nie jest w stanie zrozumieć co próbujesz osiągnąć.
Więc albo wytłumacz (dokładnie z przykładami plików) co próbujesz osiągnąć.

0

No okej rozumiem - dopiero się uczę c++, tak więc nie mam zamiaru negować twojej opinii na temat mojego kodu :D

Tego nie muszę chyba tłumaczyć

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
 
int main()
{
    string linia;
    int nr_linii=1, wpro;
 
    cout<<"Ile osob chcesz wprowadzic: "; cin>>wpro;
 
    string nazwisko[wpro], mail[wpro], imie[wpro], sciezka[wpro];
    int nr_tel[wpro];







 /*W tym miejscu tworzę zmienną plik4 oraz za jej pomocą tworzę plik wizytówka.html do którego będą wprowadzane informacje*/
    fstream plik4;
    plik4.open("wizytowka.html", ios::out);
 
/* sprawdzam czy plik istnieje w przeciwnym wypadku jest zwrócona wartość false */
    if(plik4.good()==false)
    {
        cout<<"Plik koncowy nie istnieje...!";
        exit(0);
    }
 /* powtarzam tą samą czynność co z plik4 tylko w tym wypadku informacje będą pobierane z pliku1 - 1.txt */
    fstream plik1;
    plik1.open("1.txt", ios::in);
 
    if(plik1.good()==false)
    {
        cout<<"Plik head nie istnieje...!";
        exit(0);
    }
 
 /* tutaj jest ta część kodu którą proponujesz mi podmienić; tworzę pętle która tworzy 38 komórek do których jest wczytywane kolejno 38 linijek z pliku 1.txt a następnie przepisywane do wizytowka.html */
    while(getline(plik1, linia))
    {
        switch (nr_linii)
        {
            case 1: linia;          break;
            case 2: linia;          break;
            case 3: linia;          break;
            case 4: linia;          break;
            case 5: linia;          break;
            case 6: linia;          break;
            case 7: linia;          break;
            case 8: linia;          break;
            case 9: linia;          break;
            case 10: linia;         break;
            case 11: linia;         break;
            case 12: linia;         break;
            case 13: linia;         break;
            case 14: linia;         break;
            case 15: linia;         break;
            case 16: linia;         break;
            case 17: linia;         break;
            case 18: linia;         break;
            case 19: linia;         break;
            case 20: linia;         break;
            case 21: linia;         break;
            case 22: linia;         break;
            case 23: linia;         break;
            case 24: linia;         break;
            case 25: linia;         break;
            case 26: linia;         break;
            case 27: linia;         break;
            case 28: linia;         break;
            case 29: linia;         break;
            case 30: linia;         break;
            case 31: linia;         break;
            case 32: linia;         break;
            case 33: linia;         break;
            case 34: linia;         break;
            case 35: linia;         break;
            case 36: linia;         break;
            case 37: linia;         break;
            case 38: linia;         break;
        }
        nr_linii++;
        plik4<<linia<<endl;
    }
  
 /* oczywiscie zamknięcie odczytu danych z 1.txt jako iż będzie on dalej mi już całkowicie zbędny */
    plik1.close();

/* tworzę pętlę która wykona się tyle razy jaką wartość podaliśmy wcześniej dla wpro czyli ilości osób jaką będę chciał wprowadzić do pliku wizytowka.html
dokłądniej   w pętli najpierw jest tworzony plik memb.txt do którego będą zapisywane/dopisywane informacje w przypadku istnieja juz wczesniej tego pliku
a opisując to po kolei otwieram plik memb.txt, sprawdzam czy isnieje taki plik (chociaż nwm po co bo i tak prgram go utworzy - to muszę wykasować), otwieram plik temp.txt gdzie znajduje się szablon z danymi które będę chciał przepisać do wizytowka.html, sprawdzam czy ten plik istnieje, później program pyta nas o dane takie jak imie, nazwisko, nr_tel, mail dla każdej z osób, następnie część linii z temp.txt zostaje zamieniona na dane osoby, zamykam temp.txt
ponownie dałem zbędne sprawdzenie czy plik memb.txt istnieje, następnie przepisuję dane wraz z szablonem z memb.txt do wizytowka.html */
    for( int ii=0; ii<wpro; ii++)
    {
    fstream plik;
    plik.open("memb.txt", ios::out | ios::app);
 
    if(plik.good()==false)
    {
        cout<<"Plik z danymi nie istnieje...!";
        exit(0);
    }
 
    fstream plik2;
    plik2.open("temp.txt", ios::in);
 
    if(plik2.good()==false)
    {
        cout<<"Plik z szblonem nie istnieje!";
        exit(0);
    }
 
        nr_linii=1;
        cout<<"Podaj imie nr"<<ii+1<<": ";
        cin>>imie[ii];
        cout<<"Podaj nazwisko nr"<<ii+1<<": ";
        cin>>nazwisko[ii];
        cout<<"Podaj nr_tel"<<ii+1<<": ";
        cin>>nr_tel[ii];
        cout<<"Podaj mail nr"<<ii+1<<": ";
        cin>>mail[ii];
        while(getline(plik2, linia))
        {
            switch (plik2, nr_linii)
            {
                case 1: linia;              break;
                case 2: linia;              break;
                case 3: linia;              break;
                case 4: linia;              break;
                case 5: linia;              break;
                case 6: linia;              break;
                case 7: linia=imie[ii];      break;
                case 8: linia;              break;
                case 9: linia;              break;
                case 10: linia=nazwisko[ii]; break;
                case 11: linia;             break;
                case 12: linia;             break;
                case 13: linia=nr_tel[ii];   break;
                case 14: linia;             break;
                case 15: linia;             break;
                case 16: linia=mail[ii];     break;
                case 17: linia;             break;
                case 18: linia;             break;
                case 19: linia;             break;
            }
            nr_linii++;
            plik<<linia<<endl;
        }
    plik2.close();
    plik.close();
 
 
 
    plik.open("memb.txt", ios::in);
 
    if(plik.good()==false)
    {
        cout<<"Plik z danymi nie istnieje...!";
        exit(0);
    }
        nr_linii=1;
        while(getline(plik, linia))
        {
            switch (plik, nr_linii)
            {
                case 1: linia;              break;
                case 2: linia;              break;
                case 3: linia;              break;
                case 4: linia;              break;
                case 5: linia;              break;
                case 6: linia;              break;
                case 7: linia=imie[ii];     break;
                case 8: linia;              break;
                case 9: linia;              break;
                case 10: linia=nazwisko[ii];break;
                case 11: linia;             break;
                case 12: linia;             break;
                case 13: linia=nr_tel[ii];  break;
                case 14: linia;             break;
                case 15: linia;             break;
                case 16: linia=mail[ii];    break;
                case 17: linia;             break;
                case 18: linia;             break;
                case 19: linia;             break;
            }
            nr_linii++;
            plik4<<linia<<endl;
            }
            plik.close();
        }
 
 /* otwieram plik do odczytu 3.txt, sprawdzam czy na pewno owy istnieje*/
    fstream plik3;
    plik3.open("3.txt", ios::in);
 
        if(plik3.good()==false)
    {
        cout<<"Plik footer nie istnieje...!";
        exit(0);
    }
 /*przepisuje szablon z 3.txt do wizytowka.html */
    while(getline(plik3, linia))
    {
        switch (nr_linii)
        {
            case 1: linia; break;
            case 2: linia; break;
            case 3: linia; break;
            case 4: linia; break;
            case 5: linia; break;
            case 6: linia; break;
            case 7: linia; break;
        }
        nr_linii++;
        plik4<<linia<<endl;
    }
    plik3.close();
    plik4.close();
    return 0;
}
0

Kod mogę przeczytać lepiej od ciebie nawet twój,
podaj przykład pliku wizytówka, przykład tabelki z twoimi danymi oraz pliki wynikowe które mają powstać.

0

nie wiem czy wiesz, ale twój switch nie robi nic pożytecznego.... nie modyfikuje niczego, nic nie wypisuje, nie wpływa na działanie programu... no może go spowalnia, ale nic poza tym... bo jak masz numer lini 3 to wyjdzie, ze switcha, jak 4 to też, jak 19 to też, jak 38(którego nie uwzględniłeś) to te też wyjdzie ze swticha i nie zrobi nic poza tym... więc po co ci ten switch?

0

Proszę :P w pliku contact.html masz jak chciał bym aby to wyglądało
I program robiłem w code block'u jak coś
http://host1gb.net.pl/download.php?file=4d3205067bc92de6dec2df5d23aac8b0

0

To straszne!
Zrobiłem taki mały przykładzik, wystarczy zrozumieć i zaadoptować:

#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
using namespace std;

// content.htm
/*
<html>
  <table>
    <tr><td><b>imie</b></td><td><b>email</b></td></tr>
{$ROWS}
  </table>
</html>
*/
// item.htm
/*
    <tr><td>{$NAME}</td><td>{$MAIL}</td></tr>
*/
void fatal(bool bad,const char *msg)
  {
   if(bad) exit((cerr<<msg<<endl).good());
  }

string readAllFile(const char *filename)
  {
   ifstream fin(filename);
   fatal(!fin,"Nie udalo sie odczytac pliku");
   string content;
   getline(fin,content,'\0');
   return content;
  }

void replace(string &text,const string &src,const string &rep)
  {
   size_t pos=text.find(src);
   fatal(pos==string::npos,"Nie udalo sie znalezc slowa");
   text.replace(pos,src.length(),rep);
  }

int main()
  {
   const string fldName("{$NAME}");
   const string fldMail("{$MAIL}");
   const string fldRows("{$ROWS}");
   string content=readAllFile("content.htm");
   string item=readAllFile("item.htm");
   while(true)
     {
      cout<<"Podaj imie (puste->koniec): ";
      string name;
      getline(cin,name);
      if(!name.size()) break;
      cout<<"Podaj mail: ";
      string mail;
      getline(cin,mail);
      string row(item);
      replace(row,fldName,name);
      replace(row,fldMail,mail);
      replace(content,fldRows,row+fldRows);
     }
   replace(content,fldRows,"");
   ofstream fout("result.htm");
   fout<<content;
   return 0;
  }
0

Woo
Twój kod wygląda 100x lepiej :o, a co najważniejsze sprawnie działa o.O
Dzięki za pomoc, postaram się wykorzystać to _

1 użytkowników online, w tym zalogowanych: 0, gości: 1