Witam, mam zadanie w którym z pliku binarnego struktura zawodnik w którym jest pole imię i nazwisko pobrać dane i zapisać do pliku tekstowego pary nazwisk ( pierwszy z ostatnim , drugi z przedostatnim itd ) używając stosu i kolejki. Wytłumaczy ktoś jak to zrobić?

- Rejestracja:około 8 lat
- Ostatnio:3 minuty
- Postów:4896
Po co Ci stos i kolejka, kolejka wystarczy(dokładniej Double Ended Queue, dalej DEQ). W DEQ, dokładanie i ściąganie elementów, z końca i początku są O(1)
.
http://www.cplusplus.com/reference/deque/deque/






- Rejestracja:około 7 lat
- Ostatnio:ponad 5 lat
- Postów:70
Posługując się podwójną kolejką można korzystać ze struktur czy tylko z klasy? Trochę poczytałem o kolejkach i tak oto powstał początek kodu.
#include <iostream>
#include <fstream>
#include <string>
#include <queue>
using namespace std;
#pragma pack(push, 1)
struct player
{
string name;
string surname;
};
#pragma pack(pop)
queue <player> quequeplayer;
int main()
{
ifstream ifs("plik.bin", ios::binary);
char* temp = new char[sizeof(player)]; // tymczasowy bufor na dane
ifs.read(temp, sizeof(player)); // wczytujemy dane do bufora
player* file = (player*)(temp); // rzutujemy zawartość bufora na typ File
cout << file->name << " " << file->surname << endl;
delete file;
}
Początek już mam, teraz jak zrobić aby zapisać do pliku tekstowego pary nazwisk tj jest w zadaniu?

- Rejestracja:ponad 6 lat
- Ostatnio:około 2 lata
To nie zadziała.
std::string
to coś innego niż char*
.
sizeof(std::string)
nie pokaże Ci wielkości (długości) ciągu. W większości przypadków będzie różny od wartości std::string::length(), której oczekujesz.
Musisz to rozwiązać inaczej.
Zapisując dodawaj długość ciągu na początku lub odczytuj do znaku '\0'
.
Jak robisz new[]
to zwalnianie też musi być z nawiasami (delete[]
).

sizeof(void*)
. Bądź co bądź, poza wskaźnikiem na dane, będzie tam co najmniej trzymany rozmiar stringa. U mnie na maszynie, rozmiar ten to 32 (a rozmiar void*
to 8).


sizeof(std::string) == 8
o ile wersja GCC < 5. U mnie na komputerze jest 8.3. Poza tym, są różne dziwne kompilatory i różne dziwne platformy gdzie istotnie te rozmiary są równe, ale zazwyczaj jednak tak nie jest (bo na x86-{64,32} i na każdej wersji clanga i MSVC te rozmiary są różne).



- Rejestracja:prawie 10 lat
- Ostatnio:około 3 godziny
- Postów:530
Używając tylko kolejki i stosu można napisać następujący algorytm ( zakładam że liczba nazwisk jest parzysta ):
#include <iostream>
#include <stack>
#include <queue>
#include <vector>
using namespace std;
int main()
{
vector<string> names = { "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8" };
vector<pair<string,string>> namePairs;
queue<string> queueNames; // FIFO
stack<string> stackNames; // LIFO
for( const auto& name : names )
{
queueNames.push(name);
stackNames.push(name);
}
for( auto i=0 ; i<names.size()/2 ; ++i )
{
namePairs.push_back( { queueNames.front() , stackNames.top() } );
queueNames.pop();
stackNames.pop();
}
for( const auto& [back,front] : namePairs )
{
cout << back << " " << front << "\n";
}
return 0;
}