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

wczytywanie danych z pliku do tablicy struktur i wyśiwietlanie tablicy struktur

Ostatnio zmodyfikowano 2015-09-19 16:59
Autor Wiadomość
luke_nav
Temat założony przez niniejszego użytkownika
wczytywanie danych z pliku do tablicy struktur i wyśiwietlanie tablicy struktur
» 2015-09-19 14:58:36
Witam!
Program liczy ilość linijek w pliku tekstowym:

R3023 126.5 80 80.4 10
R3104 140.8 65 65.6 10
R3160 147.9 70 70.6 10
R3181 138.7 65 64.9 10
R3197 139.7 70 69.4 10
R3212 136.3 70 70.5 10
R3217 140.5 65 65.0 10
R3232 142.3 65 66.0 10
R4120 132.2 70 72.3 10
R4121 149.8 65 67.8 10
R4128 142.9 65 64.6 10
R4129 137.4 70 68.8 10
R4192 138.0 65 66.1 10
R4223 133.4 70 70.9 10

Następnie tworzy tablicę struktur i wczytuje kolejne dane.
Przy wyświetlaniu danych, w miejsce ostatniej linijki, wyświetla pierwszą linijkę.
Jeśli w pliku txt dodam jeszcze jedną pustą linijkę, wówczas wyświetli wszystkie dane z pliku + ponownie pierwszą linijkę.

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

struct results
{
    std::string decor;
    float saturation;
    float Nominal_grammage;
    float Real_grammge;
    int count;
};

results read_file( std::string, int, results[] );
int exists( std::string );
void print_file( results[], int );

int main()
{
    std::string filename = "nasycenie_full.txt";
    int lines = exists( filename );
    if( lines == 0 )
    {
        std::cout << "Empty" << std::endl;
        EXIT_FAILURE;
    }
    if( lines > 0 )
         std::cout << "lines:" << lines << std::endl;
   
    results * pt = new results[ lines ];
   
    for( int i = 0; i < lines; i++ )
         pt[ i ] = read_file( filename, lines, pt ); //??
   
    print_file( pt, lines );
   
    delete[] pt;
    return 0;
}

int exists( std::string filename )
{
    std::ifstream rFile( filename );
    if( !rFile.is_open() )
         return 0;
   
    int counter = 0;
    std::string lines;
   
    while( rFile.good() )
    {
        getline( rFile, lines );
        counter++;
    }
    rFile.close();
    return counter;
}

results read_file( std::string filename, int lines, results paper[] )
{
    std::ifstream rFile( filename );
    for( int i = 0; i < lines; i++ )
    {
        rFile >> paper[ i ].decor;
        rFile >> paper[ i ].saturation;
        rFile >> paper[ i ].Nominal_grammage;
        rFile >> paper[ i ].Real_grammge;
        rFile >> paper[ i ].count;
    }
    rFile.close();
    return * paper;
}

void print_file( results pt[], int line )
{
    for( int i = 0; i < line; i++ )
    std::cout << i + 1
    << ": " << pt[ i ].decor
    << "\t" << pt[ i ].Nominal_grammage
    << "\t" << pt[ i ].Real_grammge
    << "\t" << pt[ i ].saturation
    << "\t" << pt[ i ].count
         << std::endl;
   
}

Log kompilacji (z dodaną pustą linijka na końcu pliku txt):

lines:15
1: R3023        80      80.4    126.5   10
2: R3104        65      65.6    140.8   10
3: R3160        70      70.6    147.9   10
4: R3181        65      64.9    138.7   10
5: R3197        70      69.4    139.7   10
6: R3212        70      70.5    136.3   10
7: R3217        65      65      140.5   10
8: R3232        65      66      142.3   10
9: R4120        70      72.3    132.2   10
10: R4121       65      67.8    149.8   10
11: R4128       65      64.6    142.9   10
12: R4129       70      68.8    137.4   10
13: R4192       65      66.1    138     10
14: R4223       70      70.9    133.4   10
15: R3023       80      80.4    126.5   10
Press any key to continue . . .  

Wiem, że problem tkwi w przekazywaniu struktury, ale nie mam pomysłu, jak to rozwiązać.
P-137677
ablikexe
» 2015-09-19 15:48:18
Witaj!

Wczytujesz dane z pliku wiele razy (konkretnie, tyle razy, ile linii ma plik):

for( int i = 0; i < lines; i++ )
    pt[ i ] = read_file( filename, lines, pt ); //??

Jak sama nazwa wskazuje, read_file wczytuje cały plik, a nie tylko jedną linię - wystarczy więc ją wywołać tylko raz. Ale to, co jeszcze powinieneś zmienić: zwraca ona dane z pierwszej wczytanej linii: mowa o linijce return * paper;. Zmienna paper jest tablicą, tak więc jej wartość jest wskaźnikiem na pierwszy element tablicy. Czyli *paper oznacza to samo co paper[0].

Pozdrawiam!
Albert
P-137679
luke_nav
Temat założony przez niniejszego użytkownika
» 2015-09-19 16:59:19
No tak.
Czyli mogę wywołać X razy funkcję i zwracać *paper, lub wywołać raz i zwrócić adres pierwszego elementu, ale wtedy funkcja musi wyglądać:

results * read_file( std::string, int, results[] );
 
Dzięki!
P-137681
« 1 »
  Strona 1 z 1