*   >> läser Utbildning artiklar >> education >> college and university

Modul 9: Introduktion till C och C ++

MODUL 9 Omdömen

---------------------------- --------------------- #include //för systemet () #include ... {C ++ koder ...} --------- ---------------------------------------- bör ändras till: ----- -------------------------------------------- #include //användning C ++ wrapper att ringa C-funktioner från C ++ program ... #include using namespace std; ... {C ++ koder ...} ---------------------------------------- --------- I VC ++ /VC ++ .Net den iostream.h (rubrik med .h) är inte giltigt längre. Det bör vara C ++ sidhuvud, så att den överensstämmer med standarden.

I äldre Borland C ++ kompilator detta fortfarande fungerar, men inte korrekt längre ... och för standard C /C ++ att överföra ska vara några problem eller bättre du läser Module23 på https://www.tenouk.com/Module23.html att få helheten ... För C-koder, de fortfarande C koder: o) ================================= ======================================== ========== ================================================== ============= //Öppna och stänga fil exempel #include #include //FRAMGÅNG = 0, FAIL = 1 med användning av uppräkning enum {FRAMGÅNG, FAIL}; int main (void) {FILE * fptr; //filnamnet är tkk1103.

txt och ligger //i samma mapp som programmet char filnamn [] = "tkk1103.txt"; //ställa in värdet Reval till 0 int Reval = FRAMGÅNG; //provöppning fil för läsning, om inte ... if ((fptr = fopen (filnamn, "r")) == NULL) {printf (filnamn "Kan inte öppna% s \\ n."); Reval = FAIL; //återställa Reval 1} //om det lyckas göra ... else {printf ("Öppna% s filen framgångsrikt \\ n", filnamn); //programmet kommer att visa den adress där //filpekaren pekar på .. printf ("Värdet av fptr: 0x% p \\ n", fptr); printf ("\\ n .... filbearbetning bör göras här .... \\ n"); printf ("\\ nReady att stänga% s \\ n.

", filnamn); //avsluta ärendet strömmen ... if (fclose (fptr) == 0) printf ("Stänga% s filen framgångsrikt \\ n", filnamn); } //För Borland ... kan ta bort följande paus och biblioteket, //stdlib.h för andra kompilatorer systemet ("paus"); retur reval; } ------------------------------ Testtwo.txt ---------------- ---------------------------------- ÖPPNING, läsning, skrivning och CLOSING FIL -------- ----------------------------------- Testning fil. Denna fil som heter testtwo.txt. Efter att öppna filer för läsning och skrivning, utan fel, kommer innehållet i denna fil (testtwo.

txt) läsas och utgång (skriv) till den andra filen testone.txt och standard output (skärmen /konsol) tecken för tecken !!! --- HAPPY LÄRANDE FOLKS !!! ---- ------------------------------------- -------------------------------------------------- ----- //Läsa och skriva ett tecken i taget #include #include //uppräknade datatyp, FRAMGÅNG = 0, FAIL = 1 enum {FRAMGÅNG, FAIL}; //prototyp funktion för läsning från och skrivning ... void CharReadWrite (FILE * fin, FILE * fout); int main () {//deklarera två fil pekare ... FILE * fptr1, * fptr2; //definiera två filer namn ... char filnamn1 [] = "testone.

txt"; char filnamn2 [] = "testtwo.txt"; int Reval = FRAMGÅNG; //testa öppningen filnamn1 för att skriva .... //om misslyckas .... if ((fptr1 = fopen (filnamn1, "w")) == NULL) {printf ("Problem kan inte öppna% s. \\ n ", filnamn1); Reval = FAIL; } //Om öppna filnamn1 för att skriva är framgångsrik, //testet för att öppna för att läsa filnamn2, om inte ... else if ((fptr2 = fopen (filnamn2, "r")) == NULL) {printf ("Problem, kan inte öppna% s \\ n ", filnamn2). Reval = FAIL; } //Om det lyckas öppning för läsning från filnamn2 //och skriver att filnamn1 ...

else {//funktionsanrop för läsning och skrivning ... CharReadWrite (fptr2, fptr1); //stänga båda filerna ... if (fclose (fptr1) == 0) printf ("% s nära \\ framgångsrikt n", filnamn1); if (fclose (fptr2) == 0) printf ("% s nära \\ framgångsrikt n", filnamn2); } //För Borland om sammanställts med hjälp av dess IDE ... systemet ("paus"); retur reval; } //Läsa skrivfunktionsdefinition void CharReadWrite (FILE * fin, FILE * fout) {int c; //om slutet av filen har nåtts, do ... while ((c = fgetc (fin)) = EOF!) {//skriva till en fil ... fputc (c, fut); //visas på skärmen ...

putchar (c); } Printf ("\\ n"); } ------------------------------------ Testfour.txt ---------- --------------------------- ÖPPNING, läsa, skriva en rad tecken -------------- -------------------------------------- Det är fil testfour.txt. Denna filens innehåll ska läsas rad för rad tecken tills inga fler linje karaktär hittades. Då kommer det att matas ut på skärmen och även kommer att kopieras till fil testhree.txt. Kontrollera innehållet i testhree.txt fil ...

--------------------------------------- ------------- ------------------HA EN BRA DAG--------------- ---- ---------------------------------------------- --------------------------------------- //Läsa och skriva en rad i taget # inkluderar #include enum {FRAMGÅNG, FAIL, MAX_LEN = 100}; //funktionsprototyp för läsning och skriver av linje ... void LineReadWrite (FILE * fin, FILE * fout); int main (void) {FILE * fptr1, * fptr2; //file testhree.txt ligger vid roten, c: //du kan sätta den här filen på valfri plats förutsatt //du ger den fullständiga sökvägen, samma för testfour.

txt char filnamn1 [] = "c: \\\\ testhree. Text"; char filnamn2 [] = "c: \\\\ testfour.txt"; char Reval = FRAMGÅNG; //testet öppna testhree.txt fil för skrivning, om inte ... if ((fptr1 = fopen (filnamn1, "w")) == NULL) {printf ("Problem kan inte öppna% s för skrivning. \\ n" , filnamn1); Reval = FAIL; } //Testet öppna testfour.txt fil för läsning, om inte ... else if ((fptr2 = fopen (filnamn2, "r")) == NULL) {printf ("Problem kan inte öppna% s för läsning. \\ n ", filnamn2); Reval = FAIL; } //Om att öppna tillbaka skrivning och läsning lyckas göra ...

else {//funktionsanrop för läsning och skrivning, rad för rad ... LineReadWrite (fptr2, fptr1); //stänga båda filerna strömma ... if (fclose (fptr1) == 0) printf ("% s framgångsrikt stängt. \\ n", filnamn1); if (fclose (fptr2) == 0) printf ("% s framgångsrikt stängt. \\ n", filnamn2); } //För Borland skärmdump system ("paus"); retur reval; } Definition //funktion för linjen läsa, skriva ... void LineReadWrite (FILE * fin, FILE * fout) {//lokal variabel ... char buff [MAX_LEN]; while (! fgets (buff, MAX_LEN, fin) = null) {//skriv till fil ... fputs (fantast, fut); //skriv till skärmen ...

printf ("% s", buff); }} ----------------------------------------- Testsix.txt ---- ------------------------------------------ ÖPPNING, läsa och skriva ett block av DATA ----------------------------------------------- Detta är fil testsix.txt. Dess innehåll kommer att läsas och sedan utgång till skärmen /konsolen och kopieras till testfive.txt fil. Läsning och skrivning baseras på datablock. Kan vara den här metoden är snabbare än att läsa /skriva för tecken, med linor .....

----------------------------- ------------------ ------------------AVSLUTA------------- ------------- ------------------------------------- -------------------------------------------------- ----------- //Läsa och skriva ett kvarter i taget #include #include //deklarera enum datatyp, kommer du att detta //lära i andra modul ... enum {FRAMGÅNG, FAIL, MAX_LEN = 80}; //funktionsprototyp för blocket läsa och skriva void BlockReadWrite (FILE * fin, FILE * fout); //funktionsprototyp för felmeddelanden ... int ErrorMsg (char * str); int main (void) {FILE * fptr1, * fptr2; //definiera filnamnen ...

//filerna Platsen är vid c: \\ Temp char filnamn1 [] = "c: \\\\ Temp \\\\ testfive.txt"; char filnamn2 [] = "c: \\\\ Temp \\\\ testsix.txt"; int Reval = FRAMGÅNG; //testet öppna testfive.txt fil för skrivning, om inte ... if ((fptr1 = fopen (filnamn1, "w")) == NULL) {Reval = ErrorMsg (filnamn1); } //Testet öppna testsix.txt fil för läsning, om inte ... else if ((fptr2 = fopen (filnamn2, "r")) == NULL) {Reval = ErrorMsg (filnamn2); } //Om att öppna filer för att skriva och läsa är framgångsrik, göra ...

else {//samtalsfunktion för läsning och skrivning BlockReadWrite (fptr2, fptr1); //stänga båda filerna strömmar ... if (fclose (fptr1) == 0) printf ("% s framgångsrikt stängt \\ n", filnamn1); if (fclose (fptr2) == 0) printf ("% s framgångsrikt stängt \\ n", filnamn2); } Printf ("\\ n"); //för Borland ... systemet ("pausa"); retur reval; } Definition //funktion för blocket läs-, skriv- void BlockReadWrite (FILE * fin, FILE * fout) {int num; char buff [MAX_LEN + 1]; //utan slutet av filen för indatafil, do ... medan {//läsa ...

num = fread (buff, sizeof (char), MAX_LEN, fin) (feof (fin)!); //foga en tomtecken buff [Num * sizeof (char)] = '\\ 0'; printf ("% s", buff); //skriver ... fwrite (buff, sizeof (char), num, fut); }} //Funktionsdefinition för felmeddelande int ErrorMsg (char * str) {//visa felmeddelandet ... printf ("Problem kan inte öppna% s \\ n.", Str); återvända FAIL; } -----------------------------------------tesseven.txt------------------------------------------------------ Detta är den första textrad tesseven.txt fil DETTA ÄR DEN ANDRA textrad tesseven.txt fil detta är den tredje textrad tesseven.

txt fil Detta är den fjärde textrad tesseven.txt fil - -------------------------------------------------- -------------------------------------------- //Random tillgång till en fil #include #include enum {FRAMGÅNG, FAIL, MAX_LEN = 120}; //funktionsprototyper, söka filen lägesindikator void PtrSeek (FILE * fptr); //funktionsprototyp, berättar filen lägesindikator ... långa PtrTell (FILE * fptr); //funktionsprototyp läsa och skriver ... void DataRead (FILE * fptr); int ErrorMsg (char * str); int main (void) {FILE * fptr; char filnamn [] = "c: \\\\ Temp \\\\ tesseven.

txt"; int Reval = FRAMGÅNG; //om det finns något fel öppna filen för läsning ... if ((fptr = fopen (filnamn, "r")) == NULL) {Reval = ErrorMsg (filnamn); } //Om öppning lyckas ... else {//PtrSeek () -funktionsanrop ... PtrSeek (fptr); //avsluta ärendet strömmen ... if (fclose (fptr) == 0) printf ("% s framgångsrikt stängt. \\ n", filnamn); } //För Borland ...

systemet ("paus"); retur reval; } //PtrSeek () funktionsdefinition void PtrSeek (FILE * fptr) {lång offset1, offset2, offset3, offset4; offset1 = PtrTell (fptr); DataRead (fptr); offset2 = PtrTell (fptr); DataRead (fptr); offset3 = PtrTell (fptr); DataRead (fptr); offset4 = PtrTell (fptr); DataRead (fptr); printf ("\\ nReread den tesseven.txt i slumpmässig ordning: \\ n"); //läsa den 2: a raden i tesseven.txt fseek (fptr, offset2, SEEK_SET); DataRead (fptr); //läsa 1: a raden av tesseven.txt fseek (fptr, offset1, SEEK_SET); DataRead (fptr); //läsa den 4: e raden i tesseven.

txt fseek (fptr, offset4, SEEK_SET); DataRead (fptr); //läsa den 3: e raden i tesseven.txt fseek (fptr, offset3, SEEK_SET); DataRead (fptr); } //PtrTell () funktionsdefinition lång PtrTell (FILE * fptr) {lång Reval; //berätta fptr läget ... Reval = ftell (fptr); printf ("The fptr är% ld \\ n", Reval); retur reval; } //DataRead () funktionsdefinition void DataRead (FILE * fptr) {char buff [MAX_LEN]; //läser textraden vid fptr läge ... fgets (buff, MAX_LEN, fptr); //och visa texten ...

printf ("->% s \\ n", buff); } //Fel definition meddelandefunktionen int ErrorMsg (char * str) {//visa detta felmeddelande ... printf ("Problem, inte kan öppna% s \\ n.", Str); återvända FAIL; } ------------------------------------------------- ------------------------------------------- //Läsa, skriva, bakåt och binära data #include #include enum {FRAMGÅNG, FAIL, MAX_NUM = 5}; //funktioner prototyp ... void Datawrite (FILE * fut); void DataRead (FILE * fin); int ErrorMsg (char * str); int main (void) {FILE * fptr; //binära filer av typen ... char filnamn [] = "c: \\\\ Temp \\\\ teseight.

bin"; int Reval = FRAMGÅNG; //test för att skapa, öppna binär fil för skrivning ... if ((fptr = fopen (filnamn, "WB +")) == NULL) {Reval = ErrorMsg (filnamn); } Else {//skriva data i filen teseight.bin Datawrite (fptr); //återställa filen lägesindikator ... bakåt (fptr); //läsa data ... DataRead (fptr); //avsluta ärendet strömmen ...

if (fclose (fptr) == 0) printf ("% s framgångsrikt stängt \\ n", filnamn); } //För Borland systemet ("paus"); retur reval; } //Datawrite () funktionen definition void Datawrite (FILE * fut) {int i; dubbel buff [MAX_NUM] = {145,23, 589,69, 122,12, 253,21, 987,234}; printf ("Storleken på buff:% d-byte \\ n", sizeof (buff)); for (i = 0; i {printf ("% 5.

2f \\ n", buff [i]), fwrite (och buff [i], sizeof (dubbel), 1, fut);}} //DataRead) definition (funktion void DataRead (FILE * fin) {int i; dubbla x; printf ("\\ nReread från binär fil: \\ n"); for (i = 0; i {fread (& x, sizeof (dubbel), (size_t) 1 , fin), printf ("% 5.2f \\ n", x);}} //ErrorMsg () funktionsdefinition int ErrorMsg (char * str) {printf ("Kan inte öppna% s \\ n.", str); avkastning FAIL;} --------------------------------------- testcal.

txt ----- ---------------------------------- 23 tolv 33 10 4 6 44 31 7 50 ------ -------------------------------------------------- --------------------------------- /* C Program för att beräkna medelvärdet av en lista med tal. * //* beräkna den totala från en fil produktionen i genomsnitt * //* i en annan fil * /#include /* för exit () * /#include int main (void) {int värde, totalt = 0, räkna = 0; /* fileptrIn och fileptrOut är variabler av typen (FILE *) * /FILE * fileptrIn, * fileptrOut; char filenameIn [100], filenameOut [100], printf ("Ange en ingång filnamn (använd sökvägen om det behövs): \\ n" ); scanf ("% s", filenameIn); printf ("Ange en utdatafilnamn (använd sökvägen om det behövs): \\ n"); scanf ("% s", filenameOut); /* öppna filer för att läsa, "r" och skriva, "w" * /if ((fileptrIn = fopen (filenameIn, "r")) == NULL) {printf ("Fel vid öppning av% s för läsning.

\\ n" , filenameIn); exit

(1); } Else printf ("Öppna% s för läsning är OK. \\ N", filenameIn); if ((fileptrOut = fopen (filenameOut, "w")) == NULL) {printf ("Fel vid öppning av% s för skrivning \\ n.", filenameOut); exit

(1); } Else printf ("Öppna% s för skrivning är OK. \\ N", filenameOut); /* fscanf * /printf ("\\ nCalculate den totala ... \\ n"); while (EOF = fscanf (fileptrIn "% i", och värde)!) {totalt + = värde; ++ räkna; } /* slut medan båge * //* Skriv medelvärdet till filen * //* fprintf * /printf ("Beräkna genomsnittet ... \\ n \\ n").

fprintf (fileptrOut "Genomsnitt av% i siffror =% f \\ n", räkna, total /(dubbel) count); printf ("Genomsnitt av% i antal =% f \\ n \\ n", räkna, total /(dubbel) count); printf ("Kolla även din% s filinnehåll \\ n", filenameOut); if (fclose (fileptrIn) == 0) printf ("% s stängd framgångsrikt \\ n", filenameIn); if (fclose (fileptrOut) == 0) printf ("% s stängd framgångsrikt \\ n", filenameOut); återvända 0; } ------------------------------------------------- -------------------------------------------- //Omdirigera en standardström #include #include enum {FRAMGÅNG, FAIL, STR_NUM = 6}; void StrPrint (char ** str); int ErrorMsg (char * str); int main (void) {//förklara och definiera en pekare till sträng .

.. char * str [STR_NUM] = {"Omdirigera ett standardström till textfilen.", "Dessa 5 textrader kommer att omdirigeras", " så många saker du kan göra om du förstår "," -konceptet, bärande idé - prova detta "," -------------- KLAR ---------- ---------------- "}; char filnamn [] = "c: \\\\ Temp \\\\ testnine.txt"; int Reval = FRAMGÅNG; StrPrint (str); //skapa filen om inte existerar och öppna för att skriva ... //om det finns, kassera det tidigare innehållet ... if (freopen (filnamn, "w", stdout) == NULL) {Reval = ErrorMsg (filnamn); } Else {//ringa StrPrint funktion () ...

StrPrint (str); //stänga standard ut ... fclose (stdout); } Retur reval; } //StrPrint () funktionsdefinition void StrPrint (char ** str) {int i; for (i = 0; i //till standard output-skärm /konsol ... printf ("% s \\ n", str [i]), systemet ("paus");} //ErrorMsg () funktionen definition int ErrorMsg (char * str) {printf ("Problem kan inte öppna% s \\ n.", str), åter FAIL;} ---------------------- -------------------------------------------------- -------------- //Demonstrera bort () funktionen #include #include void main () {//deklarera en array för att lagra filnamnet ...

char filnamn [80]; printf ("Ange filnamnet som ska raderas:"); blir (filnamn); //kontrollera eventuella fel ... if (ta bort (filnamn) == 0) printf (". Filen% s har tagits bort \\ n", filnamn ), annars fprintf (stderr, "Fel vid borttagning av fil% s \\ n.", filnamn), systemet ("paus");} --------------------- -------------------------------------------------- ---------------- //Använda döpa () för att ändra ett filnamn #include #include void main () {char oldname [80], newname [80], printf ("Enter ström filnamn: "); får (oldname), printf (" Ange nytt namn för fil: "); blir (newname) if (döpa (oldname, newname) == 0) {printf ("% s har döpa% s \\ n ", oldname, newname).

} Else {fprintf (stderr, ". Ett fel har uppstått döpa% s \\ n", oldname); } Systemet ("pausa"); } ------------------------------------------------- ------------------------------------------- //Kopiera en fil #include #include int file_copy (char * oldname, char * newname); void main () {char källa [80], destination [80]; //få käll- och destinationsnamn printf ("\\ Nenter källfilen:"); får (källa); printf ("\\ Nenter målfil:"); får (destination); if (file_copy (källa, destination) == 0) puts ("Kopiera operation lyckad"); annars fprintf (stderr, "Fel vid kopiering"); systemet ("pausa"); } Int file_copy (char * oldname, char * newname) {FILE * gånger, * fnew; int c; //Öppna källfilen för läsning i binärt läge if ((vika = fopen (oldname "rb")) == NULL) avkastning -1; //Öppna målfilen för att skriva i binärt läge om ((fnew = fopen (newname "wb")) == NULL) {fclose (fold); återvända -1; } //Läs ett byte i taget från källan, om slutet av filen //inte har uppnåtts, skriver byte till destinationen, medan

(1) {c = fgetc (fold); if (! feof (fold)) fputc (c, fnew); annars avbrott; } Fclose (fnew); fclose (fold); återvända 0; } ------------------------------- Testfour.

txt --------------- --------------------- ------------------ LINUX LOR --------! ---------------- ------------ FEDORA 3, gcc xxx ----------------- --- ÖPPNING, läsa, skriva en rad tecken -------------------------------------- -------------- Detta är fil testfour.txt. Denna filens innehåll ska läsas rad för rad tecken tills inga fler linje karaktär hittades. Då kommer det att matas ut på skärmen och även kommer att kopieras till fil testhree.txt. Kontrollera innehållet i testhree.txt fil ...

--------------------------------------- ------------- ------------------HA EN BRA DAG--------------- ---- ---------------------------------------------- --------------------------------- /*************** readline .c ************ /* Läsa och skriva en rad i taget * /#include #include enum {SUCCESS, FAIL MAX_LEN = 100}; /* funktionsprototyp för läsning och skriver av linje ... * /void LineReadWrite (FILE * fin, FILE * fout); int main (void) {FILE * fptr1, * fptr2; /* fil testhree.txt ligger aktuell katalog.

du kan sätta den här filen på valfri plats under förutsättning att du ger den fullständiga sökvägen, samma för testfour.txt * /char filnamn1 [] = "testhree.txt"; char filnamn2 [] = "testfour.txt"; char Reval = FRAMGÅNG; /* testet öppna testhree.txt fil för skrivning, ... * /if ((fptr1 = fopen (filnamn1, "w")) == NULL) {printf ("Problem kan inte öppna% s för skrivning om att misslyckas. \\ n ", filnamn1); Reval = FAIL; } /* Testet öppna testfour.txt fil för läsning, om inte ... * /else if ((fptr2 = fopen (filnamn2, "r")) == NULL) {printf ("Problem kan inte öppna% s för läsning .

\\ n ", filnamn2); Reval = FAIL; } /* Om öppna tillbaka skrivning och läsning lyckas göra ... * /else {/* funktionsanrop för läsning och skrivning, rad för rad ... * /LineReadWrite (fptr2, fptr1); /* stänga båda filerna strömma ... * /if (fclose (fptr1) == 0) printf ("% s framgångsrikt stängt. \\ n", filnamn1); if (fclose (fptr2) == 0) printf ("% s framgångsrikt stängt. \\ n", filnamn2); } Retur reval; } /* Funktionsdefinition för linje läsa, skriva * /void LineReadWrite (FILE * fin, FILE * fout) {/* lokal variabel ... * /char buff [MAX_LEN].

while (! fgets (buff, MAX_LEN, fin) = null) {/* skriv till fil ... * /fputs (buff, fut); /* skriv till skärmen ... * /printf ("% s", buff); }} ------------------------------------------------ ---------------------------------------------- ////////////rwbinary.c////////////////FEDORA 3, gcc xxx ///////Läsa, skriva, spola tillbaka och binärdata #include enum {SUCCESS, FAIL MAX_NUM = 5}; //funktioner prototyp ... void Datawrite (FILE * fut); void DataRead (FILE * fin); int ErrorMsg (char * str); int main (void) {FILE * fptr; //binära filer av typen ... char filnamn [] = "/testo1/testo2/teseight.

bin"; int Reval = FRAMGÅNG; //test för att skapa, öppna binär fil för skrivning ... if ((fptr = fopen (filnamn, "WB +")) == NULL) {Reval = ErrorMsg (filnamn); } Else {//skriva data i filen teseight.bin Datawrite (fptr); //återställa filen lägesindikator ... bakåt (fptr); //läsa data ... DataRead (fptr); //avsluta ärendet strömmen ...

if (fclose (fptr) == 0) printf ("% s framgångsrikt stängt \\ n", filnamn); } Retur reval; } //Datawrite () funktionen definition void Datawrite (FILE * fut) {int i; dubbel buff [MAX_NUM] = {145,23, 589,69, 122,12, 253,21, 987,234}; printf ("Storleken på buff:% d-byte \\ n", sizeof (buff)); for (i = 0; i {printf ("% 5.2f \\ n", buff [i]), fwrite (och buff [i], sizeof (dubbel), 1, fut);}} //DataRead) definition (funktion void DataRead (FILE * fin) {int i; dubbla x; printf ("\\ nReread från binär fil: \\ n"); for (i = 0; i {fread (& x, sizeof (dubbel), (size_t) 1 , fin), printf ("% 5.

2f \\ n", x);}} //ErrorMsg () funktionsdefinition int ErrorMsg (char * str) {printf ("Kan inte öppna% s \\ n.", str); avkastning MISSLYCKAS; } ====================================================================================================;>;>.h>.h>.h>.h>.h>.h>.h>.h>.h>;>.h>.h>.h>.h>;>;>.h>.h>.h>.h>.h>.h>.h>.h>.h>.h>.h>.h>.h>.h>

Page   <<       [1] [2] [3] [4] [5] [6] [7] [8] [9] >>
Copyright © 2008 - 2016 läser Utbildning artiklar,https://utbildning.nmjjxx.com All rights reserved.