Avatar billede Slettet bruger
04. februar 2006 - 13:59 Der er 30 kommentarer og
1 løsning

Oprettelse, sletning, læsning og redigering af filer

Hej eksperter!

Er dete korrekt, at der primært er to måder at oprette, slette, læse og redigere filer på med C++?
Eks.: fopen og open - men nu vil jeg gerne have at vide, hvad forskellene er - og hvilke jeg bør bruge.

Hvordan åbner jeg en fil, hvilken metode skal jeg helst bruge?
Hvordan skriver jeg til en fil, -||-?
Læse fra en fil?
Slette en fil?
Flytte/omdøbe en fil?

Det var et par små spørgsmål til de kloge hoveder...
Avatar billede Slettet bruger
04. februar 2006 - 13:59 #1
'Er dete korrekt' skylle være 'Er det korrekt'
Avatar billede bertelbrander Novice
04. februar 2006 - 14:54 #2
I C:
fopen er standard funktionen til at åbne filer.
open er pre standard, men bruges stadig lidt men mest på linux/unix platforme. Der er ikke ret meget grund til at bruge den.
Til at læse og skrive er der fgets, fwrite, fread, fprintf, fscanf, fgetc og et par mere

I C++:
ifstream og ofstream er class'erne, deres constructor og open kan åbne filerne.
>> og << til at læse og skrive text, read og write til at læse og skrive binært.

Slette en fil: remove
Omdøbe: rename
Avatar billede Slettet bruger
04. februar 2006 - 15:01 #3
Eksempler:

fopen("C:\\Documents and Settings\\Administrator\\Desktop\\file.extension");
- Åbner file.extension

rename("C:\\Documents and Settings\\Administrator\\Desktop\\file.extension", "C:\\Documents and Settings\\Administrator\\Desktop\\file2.extension");
- Omdøber file.extension til file2.extension

remove("C:\\Documents and Settings\\Administrator\\Desktop\\file.extension");
- Sletter C:\\Documents and Settings\\Administrator\\Desktop\\file.extension

Er disse eksempler rigtige?
Hvordan oprettes en fil?
Avatar billede Slettet bruger
04. februar 2006 - 15:04 #4
Hvis jeg nu vil oprette en fil: C:\\Documents and Settings\\Administrator\\Desktop\\file.extension - og så skrive "Hej - \nhej igen!" i den - hvordan gøres dette?

Hvis jeg så vil have filen indlæst af en app, skal jeg så sige
fopen("sti", "aabningAfFil");
fread("aabningAfFil", variabel);
fclose("aabningAfFil);
???
Avatar billede arne_v Ekspert
04. februar 2006 - 15:48 #5
FILE *fp;
fp = fopen(filnavn,"w");
fprintf(fp,"linie 1\nlinie2\n");
fclose(fp);
Avatar billede arne_v Ekspert
04. februar 2006 - 15:49 #6
naar du skal laese bruger du fopen med "r"

og fgets for at laese en hel linie eller fscanf for formateret laesning
Avatar billede Slettet bruger
04. februar 2006 - 17:03 #7
#include <iostream.h>
#include <stdlib.h>

int main()
{
    FILE *fp;
    fp = fopen("C:\\Documents and Settings\\Administrator\\Desktop\\output.txt","w");
    fprintf(fp,"linie 1\nlinie2\n");
    fclose(fp);
}


Retunerer

c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp: In function `int main()':
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:6: `FILE' undeclared (first use this function)
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:6: (Each undeclared identifier is reported only once
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:6: for each function it appears in.)
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:6: `fp' undeclared (first use this function)
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:7: implicit declaration of function `int fopen(...)'
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:8: implicit declaration of function `int fprintf(...)'
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:9: implicit declaration of function `int fclose(...)'
Avatar billede arne_v Ekspert
04. februar 2006 - 21:43 #8
C eller gammeldags C++:

#include <stdio.h>

nyere C++:

#include <cstdio>

using namespace std;
Avatar billede Slettet bruger
04. februar 2006 - 22:33 #9
Okay.
Hvorfor virker dette ikke?


#include <iostream.h>
#include <stdlib.h>

#include <cstdio>

using namespace std;

#include <string>

#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil\n\nIndtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun én linie: ";
    getline(cin, titel);
    cout << "Intast tekst - benyt \'\\n\' til linieskift: ";
    getline(cin, tekst);
    cout << "\nGenererer indhold...";
    indhold = titel + "\n\n" + tekst;
    cout << " \'" << indhold << "\'\nOpretter/aabner fil...";
    FILE *fp;
    fp = fopen(sti, "w");
    cout << "\nSkriver til fil...";
    fprintf(fp, indhold);
    cout << "\nLukker fil...";
    fclose(fp);
    cout << "\nSucces!\n\nTryk <ENTER> for at lukke dette vindue.";
    getchar();
}
Avatar billede arne_v Ekspert
04. februar 2006 - 22:53 #10
// standard C++ headere i ny variant
#include <iostream>
#include <string>
// standard C headere i C++ variant
#include <cstdlib>
#include <cstdio>

using namespace std;

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil" << endl;
    cout << endl;
    cout << "Indtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun én linie: ";
    getline(cin, titel);
    cout << "Intast tekst - benyt \'\\n\' til linieskift: ";
    getline(cin, tekst);
    cout << endl;
    cout << "Genererer indhold..." << endl;
    indhold = titel + "\n\n" + tekst;
    cout << " \'" << indhold << "\'" << endl;
    cout << "Opretter/aabner fil..." << endl;
    FILE *fp = fopen(sti.c_str(), "w");
    cout << "Skriver til fil..." << endl;
    fprintf(fp, "%s", indhold.c_str());
    cout << "Lukker fil..." << endl;
    fclose(fp);
    cout << "Succes!" << endl;
    cout << endl;
    cout << "Tryk <ENTER> for at lukke dette vindue.";
    getchar();
    return EXIT_SUCCESS;
}
Avatar billede arne_v Ekspert
04. februar 2006 - 22:54 #11
jeg har reorganiseret header filerne

og brugt c_str() paa dine STL strings for at konvertere dem til char*
Avatar billede Slettet bruger
04. februar 2006 - 23:26 #12
På dansk please!
Avatar billede arne_v Ekspert
04. februar 2006 - 23:35 #13
string s1 = "ABC;

er en C++ STL string

char *s2 = "DEF";

er et nul termineret char array (C string)

hvis man har en string og skal bruge en char* saa kan man bruge s1.c_str()
Avatar billede Slettet bruger
04. februar 2006 - 23:51 #14
OK - tak!
Bare smid et svar!
Avatar billede arne_v Ekspert
05. februar 2006 - 00:12 #15
svar
Avatar billede arne_v Ekspert
05. februar 2006 - 00:13 #16
Naar du bruger C++ streams til console IO kunne du jo masske ligesaa godt bruge
C++ streams til file IO ogsaa ...
Avatar billede Slettet bruger
05. februar 2006 - 16:40 #17
På dansk tak!
Avatar billede arne_v Ekspert
05. februar 2006 - 17:27 #18
FILE *fp = fopen(filnavn,"w");
fprintf(fp,"%s %d\n","abc",123);
fclose(fp);

kan laves som

ofstream f(filnavn);
f << "abc" << " " << 123 << endl;
f.close();
Avatar billede Slettet bruger
05. februar 2006 - 17:34 #19
#include <iostream.h>
#include <stdlib.h>

#include <cstdio>

using namespace std;

#include <string>

#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil\n\nIndtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun en linie: ";
    getline(cin, titel);
    cout << "Intast tekst - kun en linie: ";
    getline(cin, tekst);
    cout << "\nGenererer indhold...";
    indhold = "- " + titel + " -\n\n" + tekst;
    cout << " \'" << indhold << "\'\nOpretter/aabner fil...";
    ofstream f(sti);
    //FILE *fp;
    //fp = fopen(sti.c_str(), "w");
    cout << "\nSkriver til fil...";
    f << indhold;
    //fprintf(fp, indhold.c_str());
    cout << "\nLukker fil...";
    f.close();
    //fclose(fp);
    cout << "\nSucces!\n\nTryk <ENTER> for at lukke dette vindue.";
    getchar();
}


Retunerer:

c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp: In function `int main()':
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: no matching function for call to `ofstream::ofstream (string &)'
D:\DEV-C_~1\Include\G__~1\fstream.h:72: candidates are: ofstream::ofstream()
D:\DEV-C_~1\Include\G__~1\fstream.h:73:                ofstream::ofstream(int)
D:\DEV-C_~1\Include\G__~1\fstream.h:74:                ofstream::ofstream(int, char *, int)
D:\DEV-C_~1\Include\G__~1\fstream.h:76:                ofstream::ofstream(const char *, int = ios::out, int = 436)
D:\DEV-C_~1\Include\G__~1\fstream.h:79:                ofstream::ofstream(const ofstream &)
Avatar billede arne_v Ekspert
05. februar 2006 - 17:45 #20
ofstream f(sti.c_str());
Avatar billede Slettet bruger
05. februar 2006 - 19:21 #21
#include <iostream.h>
#include <stdlib.h>

#include <cstdio>

using namespace std;

#include <string>

#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil\n\nIndtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun en linie: ";
    getline(cin, titel);
    cout << "Intast tekst - kun en linie: ";
    getline(cin, tekst);
    cout << "\nGenererer indhold...";
    indhold = "- " + titel + " -\n\n" + tekst;
    cout << " \'" << indhold << "\'\nOpretter/aabner fil...";
    ofstream f(c_str(sti));
    //FILE *fp;
    //fp = fopen(sti.c_str(), "w");
    cout << "\nSkriver til fil...";
    f << indhold;
    //fprintf(fp, indhold.c_str());
    cout << "\nLukker fil...";
    f.close();
    //fclose(fp);
    cout << "\nSucces!\n\nTryk <ENTER> for at lukke dette vindue.";
    getchar();
}


Retunerer:

c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp: In function `int main()':
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: implicit declaration of function `int c_str(...)'
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: warning: cannot pass objects of type `string' through `...'
Avatar billede arne_v Ekspert
05. februar 2006 - 20:16 #22
ofstream f(sti.c_str());

ikke

ofstream f(c_str(sti));
Avatar billede Slettet bruger
06. februar 2006 - 15:32 #23
Huh?
Lyder mærkeligt - men tjekker lige... Your the boss...
Avatar billede Slettet bruger
06. februar 2006 - 15:33 #24
#include <iostream.h>
#include <stdlib.h>

#include <cstdio>

using namespace std;

#include <string>

#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil\n\nIndtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun en linie: ";
    getline(cin, titel);
    cout << "Intast tekst - kun en linie: ";
    getline(cin, tekst);
    cout << "\nGenererer indhold...";
    indhold = "- " + titel + " -\n\n" + tekst;
    cout << " \'" << indhold << "\'\nOpretter/aabner fil...";
    ofstream f(c_str());
    //FILE *fp;
    //fp = fopen(sti.c_str(), "w");
    cout << "\nSkriver til fil...";
    f << indhold;
    //fprintf(fp, indhold.c_str());
    cout << "\nLukker fil...";
    f.close();
    //fclose(fp);
    cout << "\nSucces!\n\nTryk <ENTER> for at lukke dette vindue.";
    getchar();
}


Retunerer:

c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp: In function `int main()':
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: implicit declaration of function `int c_str(...)'
Avatar billede arne_v Ekspert
06. februar 2006 - 15:49 #25
ofstream f(c_str());

->

ofstream f(str.c_str());

det er en metode ikke en funktion
Avatar billede Slettet bruger
06. februar 2006 - 16:01 #26
Hvad er forskellen på metode og funktion?
Avatar billede arne_v Ekspert
06. februar 2006 - 16:05 #27
funktion = procedural programmering

metode = objekt orienteret programmering
Avatar billede Slettet bruger
06. februar 2006 - 16:05 #28
#include <iostream.h>
#include <stdlib.h>

#include <cstdio>

using namespace std;

#include <string>

#include <fstream>
#include <cstdio>
#include <cstdlib>
#include <windows.h>
#include <sys/stat.h>
#include <io.h>

int main()
{
    string sti;
    string titel;
    string tekst;
    string indhold;

    cout << "Oprettelse af og skrivning til fil\n\nIndtast sti: ";
    getline(cin, sti);
    cout << "Indtast titel - kun en linie: ";
    getline(cin, titel);
    cout << "Intast tekst - kun en linie: ";
    getline(cin, tekst);
    cout << "\nGenererer indhold...";
    indhold = "- " + titel + " -\n\n" + tekst;
    cout << " \'" << indhold << "\'\nOpretter/aabner fil...";
    ofstream f(str.c_str());
    //FILE *fp;
    //fp = fopen(sti.c_str(), "w");
    cout << "\nSkriver til fil...";
    f << indhold;
    //fprintf(fp, indhold.c_str());
    cout << "\nLukker fil...";
    f.close();
    //fclose(fp);
    cout << "\nSucces!\n\nTryk <ENTER> for at lukke dette vindue.";
    getchar();
}


Retunerer:

c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp: In function `int main()':
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: `str' undeclared (first use this function)
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: (Each undeclared identifier is reported only once
c:\docume~1\admini~1\mydocu~1\c__~1\skabel~2\main.cpp:33: for each function it appears in.)
Avatar billede arne_v Ekspert
06. februar 2006 - 16:12 #29
sorry

ofstream f(sti.c_str());
Avatar billede Slettet bruger
06. februar 2006 - 16:50 #30
Hehe ok - prøver lige...
Avatar billede Slettet bruger
06. februar 2006 - 16:53 #31
HAHAHAAA!!!
Nu virker det!
Gogolplex gange tak!
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