wczytywanie danych z pliku do tablicy struktur i wyśiwietlanie tablicy struktur
Ostatnio zmodyfikowano 2015-09-19 16:59
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ę. #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ć. |
|
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 |
|
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! |
|
« 1 » |