Permalänk
Medlem

Läsa in fil binärt...

Tjena... ok, jag vill kunna spara ner data i en fil enligt koden nedan och sen kunna stänga programmet,
öppna det och läsa in datan. Altså för köra del 1, stänga programmet och sen köra del 2,
(kommentarmarkera bara del 2, och sen bara del 1). Om jag använder del 1 och del 2 på samma gång så funkar det
men grejen är att jag vill kunna stänga programmet och sen läsa in datan igen från filen, men jag får inte det till att fungera...
får bara seg-fel eller så skriver den ut nåt helt annat.
Någon som kan hjälpa till lite?

#include <iostream> #include <fstream> #include <vector> using namespace std; struct st { char name[30]; int num; }; vector<st> el(1); void p_el(st *p); int main() { //del 1 ofstream fout("db.dat", ios::out | ios::binary); cout << "Namn: "; cin.get(el[0].name, 30); cout << "Num: "; cin >> el[0].num; fout.write((char *) &el, sizeof(el)); fout.close(); //del 2 fstream finout; finout.open("db.dat", ios::in | ios::out | ios::binary); if(finout.is_open()) { finout.read((char *) &el, sizeof(el)); for(int i = 0; i < 1; i++) p_el(&el[i]); } finout.close(); return 0; } void p_el(st *p) { cout << p->name << " " << p->num << endl; }

Visa signatur

Linux är inget operativsystem.
http://www.gnu.org/gnu/linux-and-gnu.html

Permalänk
Medlem

Skulle inte tro att det går när det gäller vector. sizeof():sen kan du t ex inte lita på eftersom de räknas ut då koden kompileras. Kolla värdet av sizeof(el) själv så ser du.

Kör med vanliga arrayer istället. Då kommer det fungera.

edit: eller gör några funktioner som stegar igenom vektorn och sparar/laddar innehållet, om du nu absolut måste använda vector.

Visa signatur

//cykze

Permalänk

std::copy är en möjlighet.

class CMyClass { char buf[10]; int i; public: CMyClass() {} CMyClass(const char* szBuf, int i) { strncpy(this->buf, szBuf, sizeof(buf)-1); this->i = i; } void Print() const { std::cout << buf << ' ' << i << std::endl; } friend std::ostream & operator<<(std::ostream &os, const CMyClass& instance); friend std::istream &operator>> (std::istream &is, CMyClass& instance); }; std::ostream & operator<<(std::ostream &os, const CMyClass& instance) { os << instance.buf << '\t' << instance.i << '\n'; return os; } std::istream &operator>> (std::istream &is, CMyClass& instance) { is >> instance.buf >> instance.i; return is; } void main() { typedef std::ostream_iterator<CMyClass> OutStreamIterator; typedef std::istream_iterator<CMyClass> InStreamIterator; static const char szFileName[] = "c:\\data.out"; { std::vector<CMyClass> vec1; vec1.push_back(CMyClass("hej", 3)); vec1.push_back(CMyClass("abc", 7)); std::ofstream os(szFileName, std::ios::binary); OutStreamIterator iterator(os, "\n"); std::copy(vec1.begin(), vec1.end(), iterator); } { std::vector<CMyClass> vec2; std::ifstream is(szFileName, std::ios::binary); InStreamIterator ii(is); std::copy(ii, InStreamIterator(), std::back_inserter(vec2)); for (std::vector<CMyClass>::const_iterator I=vec2.begin(); I!=vec2.end(); ++I) { const CMyClass & instance = *I; instance.Print(); } } }

Permalänk
Medlem

Man tackar! där var en hel del jag inte kan så jag måste nog gå igenom din kod ett par gånger.. men tack ändå.

Visa signatur

Linux är inget operativsystem.
http://www.gnu.org/gnu/linux-and-gnu.html