--
--
9 svar · 724 visningar · startad av jboy_87
--
#include <fstream>
#include <list>
#include <cstring>
using namespace std;
struct struktur {
char namn[40];
char tele[40];
} data;
void skrivfil(list<struktur> &lista);
void meny(list<struktur>& lista);
int main() {
list<struktur> lista;
strncpy(data.namn,"foo",40);
strncpy(data.tele,"bar",40);
lista.insert(lista.begin(), data);
meny(lista);
return 0;
}
void meny(list<struktur>& lista) {
skrivfil(lista);
}
void skrivfil(list<struktur> &lista) {
fstream fil;
fil.open("lista.dat", ios::binary|ios::out);
//Konventera data till char
fil.write((const char*)&(*lista.begin()), sizeof(struktur)); // 80 tecken
fil.close();
}
--
Infogar hela källkoden!
1.Skulle vara tacksam om du kunde fixa scriptet!
2. Har problem med att läsa binärfilen
3. Måste jag loopa hela här med en iterator för att skriva hela listan till en binär fil?
binary_file.write((const char*)&(*lista.begin()), sizeof(struktur));
Det är nog bättre om du dokumenterar och löser problemet själv. Däremot kan jag ge exempel:
#include <fstream>
#include <iostream>
#include <list>
#include <cstring>
using namespace std;
struct struktur {
char namn[40];
char tele[40];
} data;
void skrivfil(list<struktur> &lista);
void listamatain(list<struktur> &lista);
void meny(list<struktur>& lista);
int main() {
list<struktur> lista;
meny(lista);
return 0;
}
void meny(list<struktur>& lista) {
listamatain(lista);
skrivfil(lista);
}
void listamatain(list<struktur> &lista) {
char val;
int antal = 0;
struktur data; // Skapa ny struktur
while (antal == 0 || val == 'j' || val == 'J') {
cout << " Ange namn: ";
memset(data.namn, 0, 40);
cin.getline(data.namn, 40); // Mata in värdet i strukturen
cout << " Ange telefonnummer: ";
memset(data.tele, 0, 40);
cin.getline(data.tele, 40); // Mata in värdet i strukturen
lista.push_back(data); // skjut in värdet från strukturen längst in i listan
cout << "\n Vill du mata in fler uppgifter i listan? (j/n): ";
cin >> val;
cin.ignore();
cout << "\n";
antal++;
}
}
void skrivfil(list<struktur> &lista) {
fstream fil;
fil.open("lista.dat", ios::binary|ios::out);
list<struktur>::const_iterator it = lista.begin();
while (it != lista.end()){
fil.write((const char*)&(*it), sizeof(struktur)); // 80 tecken
++it;
}
fil.close();
fil.open("lista.dat", ios::binary|ios::in);
while (!fil.eof()){
struktur s;
memset(s.namn, 0, 40);
memset(s.tele, 0, 40);
fil.read(s.namn, 40);
fil.read(s.tele, 40);
cout << s.namn << " " << s.tele << endl;
}
fil.close();
}
om jag vill göra så här da?
fstream fil("lista.dat",ios::binary|ios::in);
list<struktur>::iterator it;
it = lista.begin();
while (it != lista.end()) {
fil.read((char*)&(*it), sizeof(struktur));
lista.push_back((*it));
it++;
}
fil.close();
Det verkar inte rimligt. Du vill alltså skriva det som finns i list<>:an, med innehållet i filen? Vad händer om det finns mer information i filen än storleken på lista - då kommer inte datat i slutet av filen med?
list<struktur> l;
while (!fil.eof()) {
struktur s;
memset(s.namn, 0, 40);
memset(s.tele, 0, 40);
fil.read(s.namn, 40);
fil.read(s.tele, 40);
l.push_back(s);
}
vad betyder memset?
Den funktionen sätter ett specificerat antal bytes till ett visst värde, med start på ett angivet utrymme i minnet.