Föreläsning 13. In- och utmatning

Relevanta dokument
Deklarera en struct som kan användas för att representera en rät linje

Föreläsning 12. struct

Föreläsning 9. struct

#include <stdio.h> #include <string.h>

Programmeringsteknik med C och Matlab

Planering Programmering grundkurs HI1024 HT TIDAA

Föreläsning 11. Strängar

Planering Programmering grundkurs HI1024 HT data

Filer och structer Del 2

Strängar. Strängar (forts.)

En kort text om programmering i C.

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Övning från förra gången: readword

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

Uppgifter till praktiska tentan, del A. (7 / 27)

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Föreläsning 10. Pekare (Pointers)

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Föreläsning 10: In- och utmatning speciellt filhantering

Tecken & Strängar. Kapitel 7

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Enklast att skriva variabelnamn utan ; innehåll och variabelnamn skrivs ut

Tentamen i Programmering grundkurs och Programmering C

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

HI1024 Programmering, grundkurs TEN

Tentamen i Programmering grundkurs och Programmering C

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tentamen i Programmering grundkurs och Programmering C

2 Pekare och dynamiska variabler.

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

4 Sammansatta datatyper

Exempelsamling Assemblerprogrammering

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Tentamen *:58/ID100V Programmering i C Exempel 3

Föreläsning 3. Programmering, C och programmeringsmiljö

Tentamen i Programmering grundkurs och Programmering C

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Programmering i C++ EDA623 Strömmar och filer. EDA623 (Föreläsning 9) HT / 19

Standardfilerna Input och Output

*Pekarvärden *Pekarvariabler & *

Standardfilerna Input och Output. Filer... Filer... vanlig utbyggnad för ökad dynamik. Filer... filtyper

struct egendefinierad typ struct LECTURE_TYPE { char teacher[99]; float lengthinminutes; char type; /* L = lecture, E = exercise */ };

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Tentamen i. Programmering i språket C

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Funktioner och programstruktur. Föreläsning 5

Kapitel 5. Strömmar. Utmatning

Funktioner och programstruktur. Föreläsning 5

Och!efter!ca!20!omgångar!hamnade!den!på!en!stabil!konfiguration!enligt!nedan! där!den!stannar!kvar.!

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Abstrakta datastrukturer

Hantering av textsträngar och talsträngar. William Sandqvist

Läsning, skrivning, tangentbord, skärm. F6: Filhantering (kap. 8) Tabell på skärmen. save

Tentamen i Programmering grundkurs och Programmering C

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

HI1024 Programmering, grundkurs TEN

Språket Python - Del 2 Grundkurs i programmering med Python

Enkla datatyper minne

Pekare och arrayer. Indexering och avreferering

Pekare ( )

Inlämningsuppgift 1, Digsim

kl Tentaupplägg

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

PC-teknik, 5 p LABORATION FILHANTERING

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

HI1024 Programmering, grundkurs TEN

4 Sammansatta datatyper

C-programmering, föreläsning 2 Jesper Wilhelmsson

C++ Lektion Tecken och teckenfält

C-programmering, föreläsning 1 Jesper Wilhelmsson

Loopar och datatyper. Föreläsning 3

TDIU01 - Programmering i C++, grundkurs

Lämna in ifylld kursvärdering tillsammans med tentamen! Lösningarna till tentamensuppgifterna sätts ut på kurssidan på nätet i dag kl 13.

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Tentamen i Programmering grundkurs och Programmering C

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Planering Programmering grundkurs HI1024 HT 2014

Textsträngar från/till skärm eller fil

5 Grundläggande in- och utmatning

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Objektorienterad Programmering (TDDC77)

Programmeringsteknik med C och Matlab

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Loopar och datatyper. Föreläsning 3

Programmering i C. Vad är C? Målsättning. Litteratur. Jämförelse med Java. Exempel : Ett program som skriver ut texten Hello, world

Transkript:

Föreläsning 13 In- och utmatning

Dagens kluring Deklarera en struct som kan användas för att representera en rät linje Använd den I main för att deklarera en variabel som du initierar så att den representerar en linje som går genom punken (0,2) och (4,-2) Om du hinner skriv en funktion som tar en linje och returnerar för vilket x den skär x-axeln

struct line //finns andra val, ex x1,y1,x2,y2 { double k,m; ; typedef struct line Line; double xcrossing(line l1) { return l1.m/l1.k; int main(){ Line myline; myline.k=-1; myline.m=2; printf("skarningen med x-axeln sker vid x = %f",xcrossing(myline)); return 0;

In- och utmatning Strömmar (streams) Binärfiler och textfiler Skriva till textfil med fprintf Läsa från textfil med fscanf Läsa in till bilregistret med fscanf Läsa med fgets Skriva och läsa binärt i bilregistret

Strömmar En ström betyder en källa för indata (tangentbordet, hårddisk, DVD, nätverksportar, ) eller ett mål för utdata (hårddisk, printer, portar, ) I C kommer vi åt strömmar via en filpekare och en ström kallas ofta helt enkelt för en fil (vilket det ofta är) När vi från vårt program vill kommunicera med hårddisken öppnar vi en ström och associerar den till en fil på hårddisken, det gör vi med fopen som returnerar en filpekare När man har läst eller skrivit klart bör man alltid stänga strömmen. Det gör man med fclose. (Ofta skrivs data inte direkt till filen utan till en buffert, stänger vi då inte filen kanske datat aldrig skriv till den fysiska filen) printf som vi tidigare har använt för utmatning använder en ström som alltid är öppen och kallas standard output, stdout. Den skriver normalt till kommandotolken men går att omdirigera scanf använder på samma sätt strömmen standard input, stdin Alla funktioner vi behöver bor i stdio.h så glöm inte #include <stdio.h>

Textfiler och binära filer Består inte alla filer av 1or och 0or? Jo frågan här är hur dessa 1or och 0or ska tolkas I en textfil ska alla ettor och nollor tolkas som ascii-tecken. Dessutom har textfiler radslut (i unix tecken 10 och i windows tecken 13 följt av tecken 10). De kan också ha ett filslutstecken. I en binärfil skrivs alla 1or och 0or ner precis som programmet har dem lagrade i minnet. Hur de ska tolkas beror på vad man skrivit. Har man skrivit ett heltal ska de tolkas så som C skriver heltal. Endast om man vet exakt vilken sorts data som skrivits är det möjligt att tolka filen. Binärfiler saknar också radslut och filslut. Ett exempel. Ska vi spara heltalet 32767 i en textfil sparar vi 5 tecken vilket tar 5 byte: 00110011 00110010 00110111 00110110 00110111 3 2 7 6 7 Sparar vi samma heltal binärt kan det representeras av 2 byte: 01111111 1111111 Binära filer blir mindre, går fortare att läsa och skriva. Textfiler kan man öppna i en texteditor och se vad de innehåller.

Skriva till textfil med fprintf int main(){ FILE *fp; fp = fopen("minfil.txt","w"); fprintf(fp,"%s\n", Tjena"); fprintf(fp,"%s\n", leget"); fprintf(fp,"%d\n",234); fclose(fp); return 0;

Med kontroll.. int main(){ FILE *fp; fp = fopen("minfil.txt","w"); if(fp!=null){//viktigare vid inläsning fprintf(fp,"%s\n", Tjena"); fprintf(fp,"%s\n", leget"); fprintf(fp,"%d\n",234); fclose(fp); else{ printf("kunde inte oppna filen?");

Läsa från textfil med fscanf int main(){ FILE *fp; char s1[wordlength],s2[wordlength]; int i; fp = fopen ("minfil.txt","r"); if(fp!=null){ fscanf(fp,"%s",s1); fscanf(fp,"%s",s2); fscanf(fp,"%d",&i); printf("last:%s,%s,%d",s1,s2,i); fclose(fp); return 0; Precis som med scanf finns risken att vi läser in längre ord än vad som får plats. Fördelen är att vi kan använda formatsträngar och därmed tex heltal. Om vi med säkerhet vet att vi inte har längre ord än WORDLENGTH tex för att vi använt det när vi skrivit filen kan man överväga att använda det ändå

Läsa in med fscanf till bilregistret Vi förutsätter här att registret är sparat till en fil kallad minfil.txt enligt följande format: volvo 1976 21000 saab 1999 34000 fiat 2013 3000

void readfromfile(car reg[],int *pnrofcars) { FILE *fp; fp=fopen("minfil.txt","r"); if(fp!=null){ char model[wordlength]; int year,milage; while(fscanf(fp,"%s",model)==1){ fscanf(fp,"%d",&year); fscanf(fp,"%d",&milage); reg[*pnrofcars]=createcar(model,year,milage); (*pnrofcars)++; fclose(fp); int main(){ Car carregister[max]; int nrofcars=0; readfromfile(carregister,&nrofcars); printregister(carregister, nrofcars); return 0;

Alternativ Vi lägger in information om antal bilar överst i filen: 3 volvo 1976 21000 saab 1999 34000 fiat 2013 3000

void readfromfile(car reg[],int *pnrofcars) { FILE *fp; fp=fopen("minfil3.txt","r"); if(fp!=null){ char model[wordlength]; int year,milage,i; fscanf(fp,"%d",pnrofcars); for(i=0;i<(*pnrofcars);i++){ fscanf(fp,"%s",model); fscanf(fp,"%d",&year); fscanf(fp,"%d",&milage); reg[i]=createcar(model,year,milage); fclose(fp);

Snyggare textfil och snyggare kod? Vi arrangerar nu textfilen enligt nedan: volvo 1976 21000 saab 1999 34000 fiat 2013 3000

void readfromfile(car reg[],int *pnrofcars) { FILE *fp; fp=fopen("minfil3.txt","r"); if(fp!=null){ char model[wordlength]; int year,milage; while(fscanf(fp,"%s %d %d",model,&year,&milage)==3){ reg[*pnrofcars]=createcar(model,year,milage); (*pnrofcars)++; fclose(fp);

fgets fscanf har precis som scanf problemet att den riskerar att läsa in större saker än var som får plats. Mycket säkrare då att använda fgets där man kan ange maximalt antal lästa tecken. Den läser endast strängar så behöver man läsa tex ett heltal får man läsa in heltalet som en sträng och sedan använda funktionen atoi (ascii to int) för att omvandla till ett heltal eller atof för decimaltal. fgets läser en hel rad och lägger in i en sträng. En egenhet är att den till skillnad från gets också lägger in \n sist i strängen. Detta vill man oftast inte och man får då manuellt byta ut det mot \0. Man kan använda fgets istället för gets för att läsa från standard in genom att helt enkelt ange stdin som ström och på så sätt få säkrare inmatning

fgets läser från fil Här kommer ett program där vi läser textrader från en fil till dess att filen är slut. Eftersom vi inte vill ha med radslutstecknet byter vi också ut det mot \0

##include <stdio.h> #include <string.h> #define WORDLENGTH 30 #define MAX 100 int main(){ char s[max][wordlength]; FILE *fp; fp = fopen ("minfil.txt","r"); if(fp!=null){ int numberof=0; while(fgets(s[numberof],sizeof(s[numberof]),fp)){ s[numberof][strlen(s[numberof])-1]='\0'; numberof++; fclose(fp); int i; for(i=0;i<numberof;i++) printf("%s\n",s[i]); return 0; //byter ut '\n'

fgets istället för gets Man kan enkelt använda fgets istället för gets om man vill ha möjligheten att inte råka läsa för många tecken. Kom bara ihåg att fgets sparar \n Vi skriver då helt enkelt: fgets(str, sizeof(str), stdin); för att läsa till str från standard in Om användaren nu matar in för många tecken så krachar inte programmet!

Binära filer I denna kurs räcker det om ni vet vad binära filer är. Vi har valt att fokusera på textfiler för att de är lite mer tillgängliga och för att de är användbara i fler sammanhang Dock är det ofta kanske lite förvånande lättare att använda binära filer. Man behöver inte bry sig om rader eller format. Man ser bara till att läsa in precis som man skrev ut. Jag visar därför hur man skulle läsa och skriva binärt i vårt bilregister för den intresserade

void writebinary(car reg[],int nrofcars) { FILE *fp; fp = fopen("bildata","wb"); if(fp==null) { printf("misslyckades med sparning pga misslyckad filoppning"); exit(exit_failure); //<stdlib.h> fwrite(&nrofcars,sizeof(nrofcars),1,fp); //det finns ett snitsigt sätt att ta reda på antal från filstorleken fwrite(reg,sizeof(car),nrofcars,fp); //här skriver vi hela arrayen med structar fclose(fp); void readbinary(car reg[],int *pnrofcars) { FILE *fp; fp = fopen("bildata","rb"); if(fp==null) { printf("misslyckad filoppning vid lasning"); exit(exit_failure); fread(pnrofcars,sizeof(*pnrofcars),1,fp); fread(reg,sizeof(car),*pnrofcars,fp); //här läser vi hela arrayen med structar fclose(fp);