12. januar 2009 - 17:27
Der er
13 kommentarer og 1 løsning
Læse fra bestemt linie og skrive til næste linie
Jeg er gået lidt i stå. Jeg er ved at skrive et program der skal kunne skrive / læse fra en notesblok fil. Jeg kan skrive 1 sæt data ind, og når man så skriver noget nyt ind, så bliver det første overskrevet. Det jeg gerne vil er at kunne skrive Kent, Birger, Bo. Gerne på hver sin linie, så jeg kan hente dataene igen. Vil gerne have mulighed for kun at hente linie 2 f.eks. Ved ikke hvor jeg skal starte og slutte... Et udsnit af min kode hidtil ser sådan ud: case 7: { string line; ifstream myfile ("data.txt"); if (myfile.is_open()) { while (! myfile.eof() ) { getline (myfile,line); cout << line << endl; } myfile.close(); } else cout << "Unable to open file"; break; } case 8: { cout <<"Hvilket kort skal skrives til tekstfil?: "; int hvil; cin >> hvil; ofstream myfile; myfile.open ("data.txt"); myfile << hvil << endl; myfile << visa.navn[hvil] << endl; myfile << visa.adresse[hvil] << endl; myfile << visa.postnummer[hvil] << endl; myfile << visa.banknummer[hvil] << endl; myfile << visa.kortnummer[hvil] << endl; myfile.close(); break; }
Annonceindlæg fra Infor
12. januar 2009 - 17:44
#1
Flade filer er ikke god som database ! Du kan vaelge et par approaches. Du kan laese hele filen ind i en vector<noget>, tilfoeje og slette i memory og saa udskrive hel filen igen. Du kan lave en binaer fil med fast record laengde, saa kan du laese og skrive records paa nummer. Du kan skifte til en rigtig database. Hvis du kun vil tilfoeje, saa er det muligt at appende til en tekstfil.
12. januar 2009 - 17:45
#2
Hvad vil du foreslå jeg gør med en rigtig database? Har du et lille eksempel jeg kan lege lidt med? :)
12. januar 2009 - 18:04
#3
Med en rigtig database kan du jo bruge SQL og finde dine brugere med en SELECT, opdatere dem med en UPDATE o.s.v.. Hvilken database har du til raadighed ? Access ? MySQL ? SQLServer ?
12. januar 2009 - 19:53
#4
Jeg har ingen til rådighed, medmindre jeg selv stiller den op. Jeg har access i min officepakke, så det vil vel være belejligt at bruge den?
12. januar 2009 - 20:38
#5
Det var en mulighed. Men jeg kan proeve at lave nogle simple eksempler. Senere.
12. januar 2009 - 20:43
#6
Super, du skal have mange tak!:)
13. januar 2009 - 04:02
#7
Jeg har nu 3 eksempler: - text file med komplet rewrite hver gang - binary file med random access - database via ODBC til MS Access
13. januar 2009 - 04:02
#8
#include <iostream> #include <fstream> #include <vector> #include <cstdlib> #include <cstring> using namespace std; const int MAX_NAME = 50; const int MAX_ADDRESS = 50; struct person { char name[MAX_NAME]; char address[MAX_ADDRESS]; }; vector<person> load(char *fnm) { vector<person> res; ifstream f(fnm); person p; while(f.getline(p.name, MAX_NAME)) { f.getline(p.address, MAX_ADDRESS); res.push_back(p); } f.close(); return res; } void save(char *fnm, vector<person> data) { ofstream f(fnm); for(int i = 0; i < data.size(); i++) { f << data[i].name << endl; f << data[i].address << endl; } f.close(); } void create() { vector<person> data; person p1; strcpy(p1.name, "Anders Andersen"); strcpy(p1.address, "A vej 1"); data.push_back(p1); person p2; strcpy(p2.name, "Børge Børgesen"); strcpy(p2.address, "B vej 2"); data.push_back(p2); save("file1.dat", data); } void show() { vector<person> data = load("file1.dat"); for(int i = 0; i < data.size(); i++) { cout << data[i].name << " : " << data[i].address << endl; } } void modify() { vector<person> data = load("file1.dat"); person p; strcpy(p.name, "Carl Carlsen"); strcpy(p.address, "C vej 3"); data.push_back(p); data.erase(data.begin() + 1); save("file1.dat", data); } int main() { create(); show(); modify(); show(); return EXIT_SUCCESS; }
13. januar 2009 - 04:02
#9
#include <iostream> #include <fstream> #include <vector> #include <cstdlib> #include <cstring> using namespace std; const int MAX_NAME = 50; const int MAX_ADDRESS = 50; struct person { char name[MAX_NAME]; char address[MAX_ADDRESS]; bool active; }; void write(fstream& f, person data, int recno) { f.seekg(recno * sizeof(person)); f.write((char *)&data, sizeof(person)); } bool read(fstream& f, person& data, int recno) { return f.seekg(recno * sizeof(person)) && f.read((char *)&data, sizeof(person)); } void create() { fstream f("file2.dat", ios::binary | ios::out); person p1; strcpy(p1.name, "Anders Andersen"); strcpy(p1.address, "A vej 1"); p1.active = true; write(f, p1, 0); person p2; strcpy(p2.name, "Børge Børgesen"); strcpy(p2.address, "B vej 2"); p2.active = true; write(f, p2, 1); f.close(); } void show() { fstream f("file2.dat", ios::binary | ios::in); int recno = 0; person data; while(read(f, data, recno)) { if(data.active) { cout << data.name << " : " << data.address << endl; } recno++; } f.close(); } void modify() { fstream f("file2.dat", ios::binary | ios::in | ios::out); person p; strcpy(p.name, "Carl Carlsen"); strcpy(p.address, "C vej 3"); p.active = true; write(f, p, 2); person del; read(f, del, 1); del.active = false; write(f, del, 1); f.close(); } int main() { create(); show(); modify(); show(); return EXIT_SUCCESS; }
13. januar 2009 - 04:02
#10
#include <iostream> #include <fstream> #include <vector> #include <cstdlib> #include <cstring> #include <windows.h> #include <sql.h> #include <sqlext.h> using namespace std; const int MAX_NAME = 50; const int MAX_ADDRESS = 50; struct person { char name[MAX_NAME]; char address[MAX_ADDRESS]; }; /* * database file3.mdb * table File * field Name Text * field Address Text */ struct db { SQLHENV env; SQLHDBC con; SQLHSTMT stmt; }; db open(char *constr) { SQLRETURN stat; char outconstr[1024]; int outconlen; db res; stat = SQLAllocEnv(&res.env); stat = SQLAllocConnect(res.env, &res.con); stat = SQLDriverConnect(res.con, NULL, (SQLCHAR *)constr,(SQLSMALLINT)strlen(constr), (SQLCHAR *)outconstr, (SQLSMALLINT)sizeof(outconstr), (SQLSMALLINT *)&outconlen,SQL_DRIVER_COMPLETE); stat = SQLAllocStmt(res.con, &res.stmt); return res; } void close(db con) { SQLFreeStmt(con.stmt, SQL_DROP); SQLDisconnect(con.con); SQLFreeConnect(con.con); SQLFreeEnv(con.env); } void ins(db con, person data) { SQLRETURN stat; char sqlstr[200]; sprintf(sqlstr, "INSERT INTO File(Name,Address) VALUES('%s','%s')", data.name, data.address); stat = SQLExecDirect(con.stmt, (SQLCHAR *)sqlstr, strlen(sqlstr)); } void del(db con, char *name) { SQLRETURN stat; char sqlstr[200]; sprintf(sqlstr, "DELETE FROM File WHERE Name='%s'", name); stat = SQLExecDirect(con.stmt, (SQLCHAR *)sqlstr, strlen(sqlstr)); } static char name[MAX_NAME]; static char address[MAX_ADDRESS]; static int namelen; static int addresslen; void sel_init(db con) { SQLRETURN stat; char sqlstr[200]; sprintf(sqlstr, "SELECT * FROM File"); stat = SQLExecDirect(con.stmt, (SQLCHAR *)sqlstr, strlen(sqlstr)); stat = SQLBindCol(con.stmt, 1, SQL_C_CHAR, name, sizeof(name), (SQLINTEGER *)&namelen); stat = SQLBindCol(con.stmt, 2, SQL_C_CHAR, address, sizeof(address), (SQLINTEGER *)&addresslen); } bool sel_next(db con, person& data) { SQLRETURN stat; stat = SQLFetch(con.stmt); if(stat != SQL_SUCCESS && stat != SQL_SUCCESS_WITH_INFO) return false; name[namelen] = '\0'; address[addresslen] = '\0'; strcpy(data.name, name); strcpy(data.address, address); return true; } void sel_end(db con) { SQLCloseCursor(con.stmt); } void create() { db con = open("Driver={Microsoft Access Driver (*.mdb)};Dbq=file3.mdb;Uid=Admin;Pwd=;"); fstream f("file2.dat", ios::binary | ios::out); person p1; strcpy(p1.name, "Anders Andersen"); strcpy(p1.address, "A vej 1"); ins(con, p1); person p2; strcpy(p2.name, "Børge Børgesen"); strcpy(p2.address, "B vej 2"); ins(con, p2); close(con); } void show() { db con = open("Driver={Microsoft Access Driver (*.mdb)};Dbq=file3.mdb;Uid=Admin;Pwd=;"); sel_init(con); person data; while(sel_next(con, data)) { cout << data.name << " : " << data.address << endl; } sel_end(con); close(con); } void modify() { db con = open("Driver={Microsoft Access Driver (*.mdb)};Dbq=file3.mdb;Uid=Admin;Pwd=;"); person p; strcpy(p.name, "Carl Carlsen"); strcpy(p.address, "C vej 3"); ins(con, p); del(con, "Børge Børgesen"); close(con); } int main() { create(); show(); modify(); show(); return EXIT_SUCCESS; }
13. januar 2009 - 04:03
#11
Der er ikke noget af koden, som er speciel god, men det bør vise lidt af mulighederne.
28. januar 2009 - 19:14
#12
Du skal have rigtig mange tak for det! Jeg vil lige gå det igennem :)
12. juli 2009 - 16:43
#13
Tak for det, vil du smide et svar? :)
13. juli 2009 - 14:20
#14
kommer her
Kurser inden for grundlæggende programmering