Avatar billede geforce3 Praktikant
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;
            }
Avatar billede arne_v Ekspert
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.
Avatar billede geforce3 Praktikant
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? :)
Avatar billede arne_v Ekspert
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 ?
Avatar billede geforce3 Praktikant
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?
Avatar billede arne_v Ekspert
12. januar 2009 - 20:38 #5
Det var en mulighed.

Men jeg kan proeve at lave nogle simple eksempler.

Senere.
Avatar billede geforce3 Praktikant
12. januar 2009 - 20:43 #6
Super, du skal have mange tak!:)
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
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;
}
Avatar billede arne_v Ekspert
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;
}
Avatar billede arne_v Ekspert
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;
}
Avatar billede arne_v Ekspert
13. januar 2009 - 04:03 #11
Der er ikke noget af koden, som er speciel god, men det bør vise lidt af mulighederne.
Avatar billede geforce3 Praktikant
28. januar 2009 - 19:14 #12
Du skal have rigtig mange tak for det! Jeg vil lige gå det igennem :)
Avatar billede geforce3 Praktikant
12. juli 2009 - 16:43 #13
Tak for det, vil du smide et svar? :)
Avatar billede arne_v Ekspert
13. juli 2009 - 14:20 #14
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester