webForumDet fria alternativet

c++ binärt och listor

9 svar · 724 visningar · startad av jboy_87

jboy_87Medlem sedan aug. 20011 099 inlägg
#1

--

Peter SMedlem sedan dec. 20025 483 inlägg
#2
  1. Använd gärna kodtaggar
  2. Vad är det som inte fungerar?
  3. Du fyller ju ingen struktur som du sedan lägger i listan
#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();
}
jboy_87Medlem sedan aug. 20011 099 inlägg
#3

--

Peter SMedlem sedan dec. 20025 483 inlägg
#4
  1. Använd gärna kodtaggar
  2. Vad är det som inte fungerar?
jboy_87Medlem sedan aug. 20011 099 inlägg
#5

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));
Peter SMedlem sedan dec. 20025 483 inlägg
#6

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();
}
jboy_87Medlem sedan aug. 20011 099 inlägg
#7

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();
Peter SMedlem sedan dec. 20025 483 inlägg
#8

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);
}
jboy_87Medlem sedan aug. 20011 099 inlägg
#9

vad betyder memset?

Peter SMedlem sedan dec. 20025 483 inlägg
#10

Den funktionen sätter ett specificerat antal bytes till ett visst värde, med start på ett angivet utrymme i minnet.

136 ms totalt · 3 externa anrop · v20260731065814-full.beb2e261
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)