1 / 47

Filer - långtidslagring

Filer - långtidslagring. Filtyper i DOS. talet ett ( int x=1; ) lagrat i en textfil , (en sekvens av tecken ( bytes )) enligt ASCII eller binärfil , kopia av primärminnesinnehållet många system har endast en filtyp ( UNIX). Textfiler.

liona
Télécharger la présentation

Filer - långtidslagring

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Filer - långtidslagring

  2. Filtyper i DOS • talet ett ( int x=1; ) lagrat i en • textfil, (en sekvens av tecken ( bytes )) enligt ASCII eller • binärfil, kopia av primärminnesinnehållet • många system har endast en filtyp ( UNIX)

  3. Textfiler • Talet int x=1; ( typiskt 4 byte ) konverteras till ASCII-koden ( 1 byte: 4910 = 3116 ) för motsvarande symbol (tecknet ’1’) och vice versa. Konvertering till och från text Text= "ASCII" Primärminne ( int = 4bytes ) 00000000 00000000 00000000 00000001 minst signifikant byte ellermest signifikanta byte kan ligga först(endianess) Sekundärminne- fil (ASCII = 1 byte) 00110001

  4. Textfiler • fördelar • data går ofta att hämta in i andra program som t ex ordbehandling och kalkylprogram • följer en standard - ASCII ( portabelt ) • nackdelar • data kan inte lagras direkt utan måste konverteras till och från "text" • t ex strukturer , struct, är besvärligt att konvertera till "text” (vårt exempel med komplexa tal är inte speciellt besvärligt)

  5. Textfiler - exempel • ett program som läser heltal från tangentbordet och skriver heltalen som "text" till en textfil • Om tangentbordet ses som en fil så genereras filslut från tangentbordet med CTRL-z ( i DOS )

  6. Textfiler - exempel • internt hanteras en fil som en pekare till typen FILE • den interna pekaren knyts till en fysisk fil, filen öppnas för skrivning ( write), en ny fil skapas • filen stängs #include <stdio.h> #include <stdlib.h> int main(void) { FILE * textFil; int heltal; textFil = fopen("c:\\ett.txt", "w"); while ( !feof( stdin )){ fscanf(stdin,"%d",&heltal); fprintf( textFil,"%d ", heltal); } fclose(textFil); return 0 ; } Varför det är ett blank-tecken instoppat här återkommer vi till längre fram nästa bild

  7. Textfiler - exempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; int heltal; textFil = fopen("c:\\ett.txt", "w"); while ( !feof( stdin )){ fscanf(stdin,"%d",&heltal); fprintf( textFil,"%d ", heltal); } fclose(textFil); return 0 ; } • konvertering från "text" till heltal • konvertering från heltal till "text"

  8. Ooops!

  9. Textfiler - exempel • onödigt att göra konvertering till heltal (fscanf(stdin,"%d",&heltal);) i detta fall, programmet "räknar" ju inte med dem! • läs och skriv som tecken direkt, sparar bytes....

  10. Textfiler - exempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; char tecken; textFil = fopen("c:\\ett.txt", "w"); while (!feof( stdin )){ fscanf(stdin, "%c",&tecken); fprintf( textFil,"%c", tecken); } fclose(textFil); return 0 ; } Ger extra tecken i filen! feof() före fscanf() .

  11. Textfiler - exempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; char tecken; textFil = fopen("c:\\ett.txt", "w"); while (fscanf(stdin, "%c",&tecken), !feof( stdin )){ fprintf( textFil,"%c", tecken); } fclose(textFil); return 0 ; } Denna ordning, fscanf() förefeof() ,är till för att undvika ”extra” tecken i filen. Filslut ctrl-z ställer till problem.

  12. Fungerar!

  13. Textfiler - exempel eller...............

  14. Textfiler - exempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; char tecken; textFil = fopen("c:\\ett.txt", "w"); while (tecken = fgetc(stdin),!feof( stdin )){ fputc( tecken,textFil); } fclose(textFil); return 0 ; } Eller så använder man funktionerna fgetc() och fputc()

  15. Fungerar!

  16. Textfiler - exempel • tvärtom, läs från fil och skriv till bildskärm .....

  17. Textfiler - exempel #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; int heltal; textFil = fopen("c:\\ett.txt", "r"); while ( !feof( textFil )){ fscanf(textFil, "%d",&heltal); fprintf( stdout,"%d", heltal); } fclose(textFil); return 0 ; } • öppnar befintlig fil för läsning (read)

  18. Först, preparera filen ett.txt

  19. Textfiler - exempel • går det att både skriva och läsa en fil i samma program? • ja det går bra med ett litet ”+” tillfogattextFil = fopen("c:\\ett.txt", "w+");

  20. Textfiler - exempel rewind(textFil); while ( !feof( textFil )){ fscanf( textFil,"%d",&heltal); fprintf( stdout,"%d", heltal); } fclose(textFil); return 0 ; } forts, läsa och skriva från fil OK. Men det är något annat fel? #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; int heltal; textFil = fopen("c:\\ett.txt", "w+"); while ( !feof( stdin )){ fscanf( stdin, "%d",&heltal); fprintf( textFil,"%d", heltal); } Nja,testa det här! Vad är felet?Prova först med två små tal och sedan med många tal.

  21. Textfiler - exempel filbuffert ( tangentbordsbuffert ) scanf() läser i detta fall förbi tecken tills den hittar något, och så länge, som det går att konvertera till heltal i en läsning detta blir ett för stort tal! detta är OK! fscanf( textFil,"%d",&heltal)

  22. Textfiler - exempel Lägger till ett blanktecken som separationstecken. rewind(textFil); while ( !feof( textFil )){ fscanf( textFil,"%d",&heltal); fprintf( stdout,"%d", heltal); } fclose(textFil); return 0 ; } forts #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; int heltal; textFil = fopen("c:\\ett.txt", "w+"); while ( !feof( stdin )){ fscanf( stdin, "%d",&heltal); fprintf( textFil, "%d ", heltal); } OK,men testa!Dubbla tecken?

  23. Textfiler - exempel För att läsa undan det sista blank-tecknet som finns inlagt i filen. • rewind(textFil); • while (fscanf( textFil,"%d",&heltal), • !feof( textFil )){ • fprintf( stdout,"%d", heltal); • } • fclose(textFil); • return 0 ; • } forts #include <stdio.h> #include <stdlib.h> int main(void) { FILE *textFil; int heltal; textFil = fopen("c:\\ett.txt", "w+"); while (!feof( stdin )){ fscanf(stdin,"%d",&heltal); fprintf( textFil, "%d ", heltal); } Ser bra ut, testa!

  24. Fungerar!

  25. Textfiler • "w" write • "r" read • "a" append • "w+" öppnar en ny fil för ”write” samt ”read” • "r+" öppnar befintlig fil för ”read” samt ”write” • "a+" öppnar fil för ”append” samt ”read”

  26. Import tillstandardapplikationer Om ditt C-program skriver en HTML-fil så kan Du se filen med din Web-Browser!

  27. /* website.c -- Makes HTML homepage for you */#include <stdio.h>#include <string.h>#define SIZE 40 #define SERVER "@kth.se" int main(int argc, char *argv[]) { char name[SIZE], adress[SIZE], tel[SIZE], zip[SIZE], user[SIZE]; FILE *out; /* Get user input */ printf("This program will help you with your homepage!\n"); printf("Type your full name.\n"); gets(name); printf("Type your adress.\n"); gets(adress); printf("Type your Zipcode and your State.\n"); gets(zip); printf("Type your telephone number.\n"); gets(tel); printf("Type your username (it's the first part of your mailadress).\n"); gets(user);

  28. /* Make HTML-page */ out = fopen("hemsida.htm", "wt"); fprintf(out, "<HTML><BODY BGCOLOR=\"#FFFFCC\">\n"); fprintf(out, "<H1>%s</H1>\n", name); fprintf(out, "<TABLE BORDER=2 BGCOLOR=\"#FFFFFF\">\n"); fprintf(out, "<TR BGCOLOR=\"#FF80FF\">\n"); fprintf(out, "<TH>Namn:</TH><TD>%s</TD></TR>\n", name); fprintf(out, "<TR BGCOLOR=\"#80FFFF\">\n"); fprintf(out, "<TH>Adress:</TH><TD>%s<BR>%s</TD></TR>\n", adress, zip); fprintf(out, "<TR BGCOLOR=\"#FFFF00\">\n"); fprintf(out, "<TH>Telefon:</TH><TD>%s</TD></TR></TABLE>\n", tel); fprintf(out, "<P><A HREF=\"mailto:%s%s\">%s%s</A>", user, SERVER, user, SERVER); fprintf(out, "</P>\n</BODY>\n</HTML>"); fclose(out);/* All done */ printf("\nThe webfile is now redy, and it's called \"hemsida.htm\".\n"); printf("Take a look at it with your web browser!"); system("PAUSE"); return 0; }

  29. Utskrifter från våra C-program kan bli mycket "fräschare", om programmet skriver en HTML-fil som visas med datorns web-browser.

  30. Textfil till Matlab /* Definition of function sinc */double sinc(double x){double y; y = (sin(x))/x;return y;} /* sinc.c -- the (sin(x))/x function */#include <stdio.h> #include <math.h> #define FILENAME "sinc.txt" double sinc(double); int main(int argc, char *argv[]) {double x, y; FILE *out; /* Get user input */ printf("This program will calculate sinc(x),"); printf(" and write x and sinc(x) to a file.\n");/* Print function to file */ out = fopen(FILENAME, "wt");for( x = -50; x < 50; x += 0.1) { y = sinc(x); fprintf(out, "%f\t%f\n", x, y); } fclose(out); printf("\nThe file is now redy, and it's called \"%s\".\n", FILENAME); printf("Load it into Matlab for a closer look!"); system("PAUSE");return 0;}

  31. /* Definition of function sinc */double sinc(double x){double y; y = (sin(x))/x;return y;} För presentationen av siffervärden kan man med fördel dra nytta av proffessionella program som Matlab eller Excel.

  32. Binärfiler Minnesdump! Konvertering till och från text Direkt Primärminne ( bytes ) int x=1; (4 bytes)00000000 00000000 00000000 00000001 Sekundärminne - filer 00000000 00000000 00000000 00000001

  33. Binärfiler • lagra på disk utan konvertering till text • fördelar • snabbt, mycket data kan lagras på en gång • strukturer kan lagras i sin helhet • nackdelar • andra program kanske inte kan läsa data t ex kalkylprogram • dålig portabilitet

  34. Binärfiler - exempel • int main(void) • { • int *tempPekare; • int n,i,j; • printf("Ange antal temperaturer --> "); scanf("%d",&n); • tempPekare = (int *) calloc(n,sizeof(int)); • /* calloc allokerar ett sammanhängande block, */ • /* detta medför "array-möjlighet" */ • for (i=0 ; i<n ; i++){ • printf("Ge temperatur %d --> ",i);scanf("%d",tempPekare+i); • } • for (i=0 ; i<n ; i++) • printf("\ntemp %d = %d",i, tempPekare[i]); • LagraPaFil( tempPekare, n); • free(tempPekare) ; • return 0; Pekarstegning resp index.

  35. Binärfiler - exempel Skriver (n*sizeof()) bytes en gång från adress tempPekare till utFil. Returvärdet från fwrite() blir 0 eller 1 om skrivningen misslyckas eller ej. void LagraPaFil( int* tempPekare, int n ) { char filnamn[25]; FILE *utFil; printf("\nAnge filens operativsystemnamn --> "); scanf("%s", filnamn ); utFil = fopen( filnamn, "wb"); fwrite( tempPekare , n*sizeof( *tempPekare ) , 1 , utFil); fclose( utFil ); return; }

  36. Binärfiler - exempel • eller ......

  37. Binärfiler - exempel Skriver (n*sizeof()) bytes n gånger från adress tempPekare till utFil. Returvärdet från fwrite() blir 0 eller n ,dvs antal lyckade skrivningar . void LagraPaFil( int* tempPekare, int n ) { char filnamn[25]; FILE *utFil; printf("\nAnge filens operativsystemnamn --> "); scanf("%s", filnamn ); utFil = fopen( filnamn, "wb"); fwrite( tempPekare , sizeof( *tempPekare ) , n , utFil); fclose( utFil ); return; }

  38. Binärfiler - exempel void LagraPaFil( int* tempPekare, int n ) { char filnamn[25]; FILE *utFil; int temp; printf("\nAnge filens operativsystemnamn --> "); scanf("%s", filnamn ); utFil = fopen( filnamn, "w+b"); fwrite( tempPekare , n*sizeof( *tempPekare ) , 1 , utFil); /* kontroll */ rewind( utFil ); while ( !feof(utFil) ){ fread( &temp, sizeof( int ), 1 , utFil ); printf("\nTemperatur = %d", temp ) ; } fclose( utFil ); return; } tillägg på föregående program Nja, testa!

  39. Binärfiler - exempel void LagraPaFil( int* tempPekare, int n ) { char filnamn[25]; FILE *utFil; int temp; printf("\nAnge filens operativsystemnamn --> "); scanf("%s", filnamn ); utFil = fopen( filnamn, "w+b"); fwrite( tempPekare , n*sizeof( *tempPekare ) , 1 , utFil); /* kontroll */ rewind( utFil ); while ( !feof(utFil) ){ fread( &temp, sizeof( int ), 1 , utFil ); printf("\nTemperatur = %d", temp ) ; } fclose( utFil ); return; } tillägg på föregående program Inte bra, dubbelt på slutet

  40. Binärfiler - exempel rewind( utFil ); while ( !feof(utFil) ){ fread( &temp, sizeof( int ), 1 , utFil ); printf("\nTemperatur = %d", temp ) ; } modifiering Testa! /* kontroll */ rewind( utFil ); while (fread( &temp, sizeof( int ), 1 , utFil ) ) printf("\nTemperatur = %d", temp ) ;

  41. Kör vid labben … void LagraPaFil( int* tempPekare, int n ){char filnamn[25]; FILE *utFil;int temp, antal;char c; utFil = fopen( "temp.bin", "wb"); fwrite( tempPekare , n*sizeof( *tempPekare ) , 1 , utFil); /* kontroll */ fclose(utFil); utFil = fopen( "temp.bin", "rb"); printf("\n\nTemperatures from file:");while (fread( &temp, sizeof( int ), 1 , utFil )== 1 ) { printf("\nTemperatur = %d", temp ) ; } fclose( utFil );return;} Tips! Variant. Läs så länge retur-värdet är det rätta …

  42. Fungerar!

  43. Binärfiler - exempel Declaration int fseek(FILE *stream, long offset, int whence); • direktåtkomst,flytta aktuellposition i filen SEEK_xxx #defines <IO.H, STDIO.H> #defines that set seek starting points Constant Value File Location SEEK_SET 0 Seeks from beginning of file SEEK_CUR 1 Seeks from current position SEEK_END 2 Seeks from end of file /* kontroll */ rewind( utFil ); fseek(utFil, 1*sizeof( int ), SEEK_SET); fread( &temp, sizeof( int ), 1 , utFil ) ; printf("\nTemperatur = %d", temp ) ;

  44. Binärfiler ftell <STDIO.H> Returns the current file pointer Declaration long ftell(FILE *stream); Remarks ftell returns the current file pointer for stream. If the file is binary, the offset is measured in bytes from the beginning of the file

  45. Byt plats på två poster i en fil /* byt plats på två poster i en fil */#include <stdio.h>struct vpost {long varunr;int antal;}; int main(void){struct vpost vi, v2; FILE *lfil; lfil = fopen(”lagerfil”, ”rb+”); fseek(lfil, 58*sizeof(struct vpost), SEEK_SET); fread(&v1, sizeof(struct vpost), 1, lfil); fread(&v2, sizeof(struct vpost), 1, lfil); fseek(lfil, -2*sizeof(struct vpost), SEEK_CUR); fwrite(&v2, sizeof(struct vpost), 1, lfil); fwrite(&v1, sizeof(struct vpost), 1, lfil); fclose(lfil);} Så här visar läroboken hur man kan byta plats på två poster i en binärfil. OBS! behövs ej för labuppgiften! Sök post 58, läs 58 och 59, backa två steg, skriv 59 och 58.

  46. Binärfiler • "wb" write • "rb" read • "ab" append • "wb+" öppnar en ny fil för ”write” samt ”read” • "rb+" öppnar befintlig fil för ”read” samt ”write” • "ab+" öppnar fil för ”append” samt ”read”

  47. Slut

More Related