C++ Nybörjarguide forts

Tillbaka till artikelarkivet

Filer

Verktyg

Kommentarer (35)
Utskriftsvänligt format

Betyg

markedunmaked 5.7

Välkommen till fortsättningskursen i C++, om ni är här så har ni troligtvis redan läst artiklen C++ Nybörjarguide av Independence. Här kommer ni få lära er om:

Structurer & fstream
Vectorer & Listor
Stackar & Köer
Sök & Sorterings algoritmer
m.m.

Navigation:

Text - 1 Struct & fstream

Säg att du vill skapa ett spel med monster, dessa monster har en masa värden så som namn, styrka och liv. Eftersom alla monster har samma egenskaper men är olika bra på olika saker så vill du enkelt kunna skapa likadana variabler till massa monster. Till din hjälp har du strukturer.

fstream står för FileStream och gör att man kan spara text i filer, vilket gör det möjligt att till exempel spara vart man är någonstans i ett spel, vad för grejer man har och liknande saker.

Struct

För att skapa en struct variabel skriver man:

  1. struct minstruct{
  2. string Struktvariabel;
  3. string Struktvariabel2;
  4. int Struktvariabel3;
  5. };


Oftast skrivs detta ovanför main som en global variabel men det funkar att använda i main också fast då funkar det inte någon annanstans i programmet än efter där man skrivit det. Dvs att man kan inte skapa en strukt man skapat i main inuti en funktion.

För att sen skapa en struct variabel skriver man:
  1. minstruct namn;

Och för att komma åt variablerna skrivs:
  1. namn.Struktvariabel;

Det går bra att göra en struct array dvs minstruct namn[5] och då får man 5st utav alla variabler i strukturen.

Exempel:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4.  
  5. struct rollperson{
  6. string fornamn;
  7. string efternamn;
  8. int langd;
  9. int vikt;
  10. };
  11.  
  12. int main()
  13. {
  14. rollperson gubbe;
  15. cout<<"Mata in förnamn: ";
  16. cin>>gubbe.fornamn;
  17. cout<<"Mata in efternamn: ";
  18. cin>>gubbe.efternamn;
  19.  
  20. system("cls");
  21.  
  22. cout<<"Hejsan "<<gubbe.fornamn<<' '<<gubbe.efternamn<<endl;
  23. cout<<"Mår du bra, "<<gubbe.fornamn<<'?'<<endl;
  24. return 0;
  25. }


Sist vill jag bara nämna en variabel som liknar struct, union, som skrivs exakt lika dant som struct. Men till skillnad från struct kan endast lagra en variabel, dvs att om du lagrar en variabel försvinner den du tidigare lagrat. Detta kan användas om du vill spara utrymme eller kan kanske manipuleras till ens fördel på annat sätt.

fstream

fstream är en förkortning av file stream och är byggd som iostream.

#include <fstream> - Includerar fstream biblioteket
ofstream namn; - Skapar ett fil flöde till en fil
ifstream namn; - Skapar ett fil flöde från en fil
namn.open(directory); - Upprättar en förbindelse med en fil
namn.close(); - Bryter förbindelsen med filen.
namn.is_open() - returenerar true eller false beroende på om filen lyckades öppnas.

Det går bra att skriva:
  1. ofstream namn("C:\Documents and Settings\Christofer\Mina dokument");

också, vilket troligtvis är det vanligaste sättet. Kan också använda en char array eller en char* istället för att skriva hela adressen till filen. Om filen inte finns så skapas en när man försöker skriva till den. Om man bara skriver ett namn som ofstream namn("Hej.txt"); så skapas en fil med namnet Hej.txt i samma mapp som programmet. Det går också bra med t ex mapp1/Hej.txt, i vilket fall Hej.txt skapas i mappen mapp1.

Du kan skriva namnet som ett påstående och sedan kollar datorn om filen finns, ! funkar också.
  1. if(fil)
  2. cout<<"Filen fanns";
  3. else if(!fil)
  4. cout<<"Filen fanns inte";

Det går också skriva så att om det går att göra en loop som hämtar en rad från filen tills den inte kan längre.
  1. string temp;
  2. while(fil>>temp)
  3. cout<<temp;

Det finns två olika sätt att öppna en viss fil, antingen genom att skriva:
  1. namn.open("filen.txt");

Eller att använda en char variabel:
  1. char variabel[]="filen.txt";
  2. namn.open(variabel);

Fördelen att skriva med en char är att det är väldigt lätt att byta till vilken fil du ska skriva till om du använder en global char, och användaren kan till och med själv mata in till vilken fil han vill spara.

Om filen ligger i samma mapp som programmet behöver man bara filnamnet, men glöm inte filändelsen. Om du skapar ett flöde till en fil så sparars det över. Om du inte vill att ditt program ska spara över det som står skrivet så skriver du (directory, ios::app); så byggs det bara på och inget försvinner.

Exempel:

  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. int main()
  5. {
  6. ifstream fil("temp.txt");
  7. string temp;
  8. if(fil.is_open()){
  9. fil>>temp;
  10. cout<<"Hej "<<temp;
  11. exit(1); //avslutar programmet
  12. }
  13.  
  14. else{
  15. fil.close();
  16. ofstream fil2("temp.txt");
  17. cout<<"Vad är ditt namn: ";
  18. getline(cin, temp); //tar alla tecken fram till nyrad, inklusive mellanslag.
  19. fil2<<temp;
  20. }
  21. return 0;
  22. }


Första gången du öppnar programmet så skriver du in ditt namn, sen nästa gång kommer programmet att hälsa dig välkommen.

Om du vill spara data till fil så att det inte går att läsa med nakna ögat så är det enklaste sättet binärt. Först ska jag presentera de olika verktygen.

stömnamn.write() //skriver data till en fil men tar parametervärde på hur många bitar.
strömnamn.read() //läser in data och tar parameter värde på hur många bitar som ska laddas.
sizeof() //returnerar storleken i bitar på variabeltypen som skickas med som paramenter.

write() och read tar två parameter värden, först en pekare till datan och hur många bitar som ska hämtas /skrivas.

Exempel:

  1. fil.read((char *) &variabel, sizeof(variabeltyp));
  2. fil.write((char *) &variabel, sizeof(variabeltyp));

Slut

Navigation:

Till toppen