Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Przekazywanie danych z pliku do tabeli na stronie HTML

Ostatnio zmodyfikowano 2014-12-27 23:34
Autor Wiadomość
jedrula.pogo
Temat założony przez niniejszego użytkownika
[C++] Przekazywanie danych z pliku do tabeli na stronie HTML
» 2014-12-25 13:52:46
Witam !

Moim zadaniem projektowym jest stworzenie programu, który na podstawie danych osobowych z pliku tekstowego stworzy plik HTML z tabelą.
Jestem właśnie na etapie planowania i mam parę pytań.

Format danych w pliku tekstowym ma wyglądać następująco:

#Imię  Nazwisko  Urodziny:data  Imieniny:data  <treść komentarza>  [link od zdjęcia]

Gdzie hashtag to początek wiersza. Program musi ignorować wielkość liter i wielokrotne użycie znaków białych i ma rozpoznawać trzy formaty dat. rrrr-mm-dd , dd.mm.rrrr , mm/dd/rrrr.

na przykład:

#Jan  Kowalski  urodziny:1986-12-01  imieniny:  12-02  <przyjaciel>  [\zdjecie.jpg]

Moje pomysły to :

 - Stworzę strukturę tablic by przechowywać pobrane dane (imie , nazwisko itd.), by móc je potem przenieść do etapu zapisu do pliku HTML.
 - oczywiście użyję fstreama , sprawdzę czy plik jest poprawnie otwarty...
 - zadeklaruję licznik, który będzie określał ile osób zostało odnalezionych w pliku tekstowym
 - użycie metody find do odnalezienia imion , nazwisk , urodzin , imienin (http://cpp0x.pl/kursy/Kurs-C++/Poziom-3/Wyszukiwanie-frazy-w-tekscie/352)
 - pobieranie danych wierszami getline()

Nie wiem czy moje rozumowanie jest choć trochę poprawne.

 Z utworzeniem pliku HTML z tabelą nie będzie problemu, bo zapis chyba będzie po prostu polegał na dodaniu pętli, która będzie dodawać kolejne wiersze z danymi.

Nie wiem jak rozwiązać problem z rozpoznawaniem dat, ignorowaniem wielkości liter i wielokrotnego użycia znaków białych.

Czy jest coś czego nie uwzględniłem, a powinienem ?

Liczę na porady. Wesołych Świąt.
P-123313
Monika90
» 2014-12-25 14:35:42
- Stworzę strukturę tablic by przechowywać pobrane dane (imie , nazwisko itd.), by móc je potem przenieść do etapu zapisu do pliku HTML.
Po co, chyba można generować wyjście na bieżąco podczas wczytywania pliku?

- zadeklaruję licznik, który będzie określał ile osób zostało odnalezionych w pliku tekstowym
A po co Ci licznik?

- użycie metody find do odnalezienia imion
Czy to potrzebne? Kolejność pól jest ustalona i zawsze taka sama.

- pobieranie danych wierszami getline()
Można wczytywać pola jedno po drugim.

ma rozpoznawać trzy formaty dat. rrrr-mm-dd , dd.mm.rrrr , mm/dd/rrrr.
To proste:
C/C++
char sep1, sep2;
int num1, num2, num3;
std::cin >> num1 >> sep1 >> num2 >> sep2 >> num3;
int year, month, day;
switch( sep1 )
{
case '-': year = num1; month = num2; day = num3; break;
case '.': year = num3; month = num2; day = num1; break;
case '/': year = num3; month = num1; day = num2; break;
}
//sprawdzanie błędów pominięto
P-123314
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-25 22:21:57
No dobra, załóżmy że mój plik tekstowy wygląda tak :

C/C++
# imie: Jan  nazwisko: Kowalski  urodziny: 1986-12-01  imieniny: 12-02 komentarz: <przyjaciel>  [\zdjecie.jpg]

# imie: Michal nazwisko: Pajak urodziny: 1993-03-09 imieniny: 06-03 komentarz: <kolega> [\zdjecie.jpg]
  
i chciałbym żeby docelowo na wyjściu tabela w pliku html wyglądała tak:

C/C++
< table >

< tr >
< th > Zdjecie </ th >
< th > Imie </ th >
< th > Nazwisko </ th >
< th > Urodziny </ th >
< th > Imieniny </ th >
< th > Komentarz </ th >
</ tr >
< tr > // tutaj nowe wiersze w zaleznosci od ilosci znalezionych osob w pliku tekstowym
< td > zdjecie.jpg </ td >
< td > Jan </ td >
< td > Kowalski </ td >
< td > 1986 - 12 - 01 </ td >
< td > 12 - 02 </ td >
< td > przyjaciel </ td >
</ tr >
< tr >
< td > zdjecie.jpg </ td >
< td > Michal </ td >
< td > Pajak </ td >
< td > 1993 - 03 - 09 </ td >
< td > 06 - 03 </ td >
< td > kolega </ td >
</ tr >


</ table >

Nie potrzeba w tym przypadku licznika ? Nie muszę gdzieś przechowywać tych danych znalezionych w pliku, tylko mogę je od razu przenieść w czasie rzeczywistym na wyjście ? Jeśli tak, to można ktoś podać jakąś wskazówkę jak to ugryźć ?
P-123337
jedrula.pogo
Temat założony przez niniejszego użytkownika
» 2014-12-26 15:12:32
Czytając z paru źródeł, posiedziałem trochę i wypociłem na razie coś takiego :

C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

void format_daty_urodziny( sep1, num1, num2, num3 )
{
    switch( sep1 )
    {
    case '-': year = num1; month = num2; day = num3; break;
    case '.': year = num3; month = num2; day = num1; break;
    case '/': year = num3; month = num1; day = num2; break;
    }
}


void format_daty_imieniny( sep3, num4, num5 )
{
    switch( sep3 )
    {
    case '-': day = num4; month = num5; break;
    case '/': day = num4; month = num5l break;
    }
}



bool wczytanie_pliku( string nazwa_pliku )
{
    ifstream plik;
   
    plik.open( nazwa_pliku.c_str() );
   
    if( !plik.good() )
         return false;
   
    while( true )
    {
        string imie;
        string nazwisko;
        char sep1, sep2; //separatory dla urodzin
        char sep3; //separator dla imienin
        int num1, num2, num3; //liczby dla urodzin
        int num4, num5; //liczby dla imienin
        string komentarz;
        string zdjecie;
       
        plik >> imie >> nazwisko >> num1 >> sep1 >> num2 >> sep2 >> num3 >> num4 >> sep3 >> num5 >> komentarz >> zdjecie;
       
        if( plik.good() )
        {
           
            format_daty_urodziny( sep1, num1, num2, num3 );
            format_daty_imieniny( sep3, num4, num5 );
           
            ofstream html( "plik_out.html" ), ios::app )
            // i tutaj wrzucenie kodu HTML i dodawanie kolejnych wierszy do body
           
        }
        else
             break; // nie ma więcej danych
       
    }
   
    return true;
}


int main()
{
    int year, month, day; //dla urodzin
    int month2, day2; //dla imienin
   
    if( !wczytanie_pliku( "plik_in.txt" ) )
         cout << "Niepowodzenie w otwarciu pliku" << endl;
   
    return 0;
}

Czy to ma sens ?

@Monika90 wykorzystałem Twój kod na rozpoznanie formatu daty.

Pytanie czy mogę w pętli (w której docelowo wczytuję dane z pliku tekstowego) rozpocząć też zapis (ofstream do pliku HTML)?

Nie mam również pojęcia jak omijać takie znaki jak Hashtag# , słowa kluczowe takie jak "urodziny:" i "imieniny:" oraz znaki < > i [ ] , bo potrzebuję przepisać do tabeli tylko tekst, a w tym momencie kod prawdopodobnie pobiera wszystko co jest stringiem , intem itp.

P-123355
darko202
» 2014-12-27 23:34:04
sens u nie ma tworzenie nowych zmiennych przy każdym przejściu pętli
C/C++
while( true )
{
    string imie;
    string nazwisko;
    char sep1, sep2; //separatory dla urodzin
    char sep3; //separator dla imienin
    int num1, num2, num3; //liczby dla urodzin
    int num4, num5; //liczby dla imienin
    string komentarz;
    string zdjecie;
    .............................................
}

jeśli otworzysz inny strumień to kto Ci zabroni robić w nim cokolwiek
P-123410
« 1 »
  Strona 1 z 1