Initial commit
This commit is contained in:
37
kapitel12/fildesc-ex1.c
Normal file
37
kapitel12/fildesc-ex1.c
Normal file
@@ -0,0 +1,37 @@
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int fd;
|
||||
int readstat;
|
||||
off_t filesize;
|
||||
struct stat fileinfo;
|
||||
char wbuf[] = "Hejsan svejsan\n";
|
||||
char rbuf[50];
|
||||
|
||||
/* Öppna filen "minfil" i läs- och skrivläge (O_RDWR).
|
||||
Skapa den om den inte redan finns (O_CREAT)
|
||||
Sätt filrättigheterna till 00644*/
|
||||
fd = open("minfil", O_CREAT|O_RDWR, 00644);
|
||||
write(fd, wbuf, sizeof(wbuf)); /* Skriv wbuf till filen */
|
||||
|
||||
/* Här börjar vi läsa in filen igen */
|
||||
fstat(fd, &fileinfo);
|
||||
filesize = fileinfo.st_size;
|
||||
printf("Storlek: %ld\n", (long int)filesize);
|
||||
/* Återställ markören till byte 0 med lseek */
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
readstat = read(fd, rbuf, filesize); /* Läs innehållet till rbuf */
|
||||
rbuf[fileinfo.st_size+1] = '\0'; /* Avsluta med NULL */
|
||||
|
||||
/* Skriv ut information och filens innehåll */
|
||||
printf("Fildeskriptorns nummer: %d\n", fd);
|
||||
printf("Returvärde från 'read': %d\n", readstat);
|
||||
printf("Inläst text: %s\n", rbuf);
|
||||
|
||||
return 0;
|
||||
}
|
43
kapitel12/fseek-ex1.c
Normal file
43
kapitel12/fseek-ex1.c
Normal file
@@ -0,0 +1,43 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int langd, bredd, hojd;
|
||||
signed char ch;
|
||||
int i;
|
||||
FILE *fp;
|
||||
|
||||
/* Kontrollera först om filen finns och om inte
|
||||
avsluta programmet och skriv ett felmeddelande */
|
||||
if ( (fp = fopen("konfigfil.txt", "r")) == 0)
|
||||
{
|
||||
printf("Filen finns inte!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
printf("Position innan läsning: %ld\n", ftell(fp));
|
||||
fscanf( fp, "längd: %d, bredd: %d, höjd: %d",
|
||||
&langd, &bredd, &hojd);
|
||||
|
||||
printf("Lådan har en volym på %d cm3\n",
|
||||
(langd * bredd * hojd));
|
||||
printf("Position efter läsning: %ld\n\n", ftell(fp));
|
||||
|
||||
printf("Läs tre byte från åttonde byten från starten:\n");
|
||||
fseek(fp, 8, SEEK_SET);
|
||||
for (i = 0; i<3; i++)
|
||||
{
|
||||
ch = fgetc(fp);
|
||||
putchar(ch);
|
||||
}
|
||||
printf("\nAktuell position: %ld\n\n", ftell(fp));
|
||||
|
||||
printf("Flyttar markören 5 bytes framåt och läser resten:\n");
|
||||
fseek(fp, 5, SEEK_CUR);
|
||||
printf("Aktuell position: %ld\n", ftell(fp));
|
||||
while ((ch = fgetc(fp)) != EOF)
|
||||
putchar(ch);
|
||||
printf("\nAktuell position: %ld\n\n", ftell(fp));
|
||||
|
||||
return 0;
|
||||
}
|
1
kapitel12/konfigfil.txt
Normal file
1
kapitel12/konfigfil.txt
Normal file
@@ -0,0 +1 @@
|
||||
längd: 33, bredd: 20, höjd: 10
|
360
kapitel12/lagerhantering-komplett.c
Normal file
360
kapitel12/lagerhantering-komplett.c
Normal file
@@ -0,0 +1,360 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Makron */
|
||||
#define NAMEMAXLENGTH 30
|
||||
|
||||
/* Globala variabler så att de är tillgängliga både
|
||||
från main() och de övriga funktionerna.
|
||||
struct myData används t.ex. både från main() och
|
||||
new() */
|
||||
struct myData
|
||||
{
|
||||
char name[NAMEMAXLENGTH];
|
||||
int quantity;
|
||||
float price;
|
||||
};
|
||||
|
||||
char filename[] = "storage.bin";
|
||||
|
||||
/* Funktionsprototyper */
|
||||
void list(struct myData *datap, int numRec);
|
||||
void search(struct myData *datap, int numRec, char *name);
|
||||
void modify(struct myData *datap, int numRec, char *name);
|
||||
void delete(struct myData *datap, int numRec, char *name);
|
||||
int new(struct myData *datap);
|
||||
void printUsage(char *arg);
|
||||
void printHeader(void);
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
FILE *fp; /* Filpekare */
|
||||
int newart = 0; /* Ska vi skapa en ny artikel? */
|
||||
int numRec; /* För antalet för artiklar */
|
||||
int create; /* För y/n-fråga */
|
||||
int opt; /* För getopt() */
|
||||
|
||||
/* Skapa en strukturvariabel (en pekare) av struct myData */
|
||||
struct myData *data;
|
||||
|
||||
/* Skriv ut hjälptexten och returnera 1 om vi saknar argument */
|
||||
if (argc < 2)
|
||||
{
|
||||
printUsage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Kontrollera om filen finns och är läs- och skrivbar.
|
||||
Om inte, fråga om vi ska skapa den och börja läsa
|
||||
in artiklar. access() är ett systemanrop för Unixmiljöer */
|
||||
if ( access(filename, R_OK|W_OK) != 0 )
|
||||
{
|
||||
/* Använd fprintf() för att skriva felmeddelanden
|
||||
till stderr */
|
||||
fprintf(stderr, "Could not open %s\n", filename);
|
||||
printf("Create the file and start adding records? (y/n): ");
|
||||
create = getchar();
|
||||
if ( create == 'y' )
|
||||
{
|
||||
/* Allokera minne för en struct myData och anropa
|
||||
sedan new() med en pekare till minnet för att lägga
|
||||
till artiklar i lagret, en i taget */
|
||||
numRec = 1;
|
||||
data = calloc(numRec, sizeof(struct myData));
|
||||
new(data);
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Öppna filen i läsläge */
|
||||
fp = fopen(filename, "rb");
|
||||
|
||||
/* Läs in befintlig data från filen till strukturen */
|
||||
fseek(fp, 0, SEEK_END);
|
||||
numRec = ftell(fp) / sizeof(struct myData);
|
||||
data = calloc(numRec, sizeof(struct myData));
|
||||
rewind(fp);
|
||||
fread(data, sizeof(struct myData), numRec, fp);
|
||||
fclose(fp);
|
||||
|
||||
/* Behandla argumenten med getopt() */
|
||||
while ((opt = getopt(argc, argv, "hls:m:d:n")) != -1)
|
||||
{
|
||||
switch (opt)
|
||||
{
|
||||
case 'l':
|
||||
list(data, numRec);
|
||||
break;
|
||||
case 's':
|
||||
search(data, numRec, optarg);
|
||||
break;
|
||||
case 'm':
|
||||
modify(data, numRec, optarg);
|
||||
break;
|
||||
case 'd':
|
||||
delete(data, numRec, optarg);
|
||||
break;
|
||||
case 'n':
|
||||
newart = 1;
|
||||
break;
|
||||
case 'h':
|
||||
printUsage(argv[0]);
|
||||
return 0;
|
||||
default:
|
||||
printUsage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Fortsätt här om filen finns och vi valde att lägga
|
||||
till artiklar */
|
||||
if ( newart == 1 )
|
||||
{
|
||||
data = calloc(1, sizeof(struct myData));
|
||||
if ( new(data) == 1 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Här är programmet klart, så frigör minnet och returnera 0 */
|
||||
free(data);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Funktionerna nedan tar en pekare till datatypen struct myData
|
||||
som första argument. Som andra argument ett heltal som innehåller
|
||||
antalet artiklar i lagret. */
|
||||
void list(struct myData *datap, int numRec)
|
||||
{
|
||||
int i;
|
||||
printHeader();
|
||||
for (i = 0; i<numRec; i++)
|
||||
{
|
||||
printf("%-30s\t", datap[i].name);
|
||||
printf("%-10d\t", datap[i].quantity);
|
||||
printf("%.2f\t", datap[i].price);
|
||||
printf("\n");
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/* Det tredje argumentet till denna funktionen är en pekare till char
|
||||
som används för att söka efter en artikel. */
|
||||
void search(struct myData *datap, int numRec, char *name)
|
||||
{
|
||||
int i;
|
||||
/* Loopa över alla artiklar i databasen */
|
||||
for (i = 0; i<numRec; i++)
|
||||
{
|
||||
/* Om ingen match finns, hoppa över och fortsätt
|
||||
till nästa */
|
||||
if ( strcmp(name, datap[i].name) != 0 )
|
||||
continue;
|
||||
printHeader();
|
||||
printf("%-30s\t", datap[i].name);
|
||||
printf("%-10d\t", datap[i].quantity);
|
||||
printf("%.2f\t", datap[i].price);
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
/* Samma argument som för search-funktionen */
|
||||
void modify(struct myData *datap, int numRec, char *name)
|
||||
{
|
||||
FILE *newfp; /* Ny filpekare för denna funktion */
|
||||
int i;
|
||||
int match = 0;
|
||||
char what[10];
|
||||
char quant[20];
|
||||
|
||||
/* Loopa över alla artiklar i lagret */
|
||||
for (i = 0; i<numRec; i++)
|
||||
{
|
||||
if ( strcmp(name, datap[i].name) == 0 )
|
||||
{
|
||||
match = 1; /* Så att vi vet om vi hittade artikeln
|
||||
när vi kommer utanför if-satsen */
|
||||
printHeader();
|
||||
printf("%-30s\t", datap[i].name);
|
||||
printf("%-10d\t", datap[i].quantity);
|
||||
printf("%.2f\t", datap[i].price);
|
||||
printf("\n\n");
|
||||
|
||||
printf("What do you like to modify? "
|
||||
"(name, quantity, price): ");
|
||||
fgets(what, 10, stdin);
|
||||
what[strcspn(what, "\n")] = '\0';
|
||||
|
||||
if ( strcmp(what, "name") == 0 )
|
||||
{
|
||||
printf("Name: ");
|
||||
fgets(datap[i].name, NAMEMAXLENGTH, stdin);
|
||||
datap[i].name[strcspn(datap[i].name, "\n")] = '\0';
|
||||
}
|
||||
else if ( strcmp(what, "quantity") == 0 )
|
||||
{
|
||||
printf("Quantity (absolute value or "
|
||||
"(a)dd/(s)ubtractNUMBER): ");
|
||||
fgets(quant, 20, stdin);
|
||||
quant[strcspn(quant, "\n")] = '\0';
|
||||
|
||||
/* Behandla det första tecknet som angavs */
|
||||
if (quant[0] == 'a') /* a för add */
|
||||
{
|
||||
quant[0] = ' '; /* Radera det första tecknet */
|
||||
datap[i].quantity = datap[i].quantity +
|
||||
atoi(quant);
|
||||
}
|
||||
else if (quant[0] == 's') /* s för subtract */
|
||||
{
|
||||
quant[0] = ' ';
|
||||
datap[i].quantity = datap[i].quantity -
|
||||
atoi(quant);
|
||||
}
|
||||
else
|
||||
datap[i].quantity = atoi(quant);
|
||||
|
||||
}
|
||||
else if ( strcmp(what, "price") == 0 )
|
||||
{
|
||||
printf("Price: "); scanf("%f", &datap[i].price);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (match == 0)
|
||||
{
|
||||
fprintf(stderr, "Could not find %s in database\n", name);
|
||||
exit(1);
|
||||
}
|
||||
/* Öppna filen i skrivläge och skriv ut den modifierade
|
||||
strukturen till filen */
|
||||
if ( (newfp = fopen(filename, "wb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Could not open file for writing\n");
|
||||
exit(1);
|
||||
}
|
||||
fwrite(datap, sizeof(struct myData), numRec, newfp);
|
||||
fclose(newfp);
|
||||
}
|
||||
|
||||
void delete(struct myData *datap, int numRec, char *name)
|
||||
{
|
||||
int i, j; /* För for-looparna */
|
||||
int match = 0;
|
||||
FILE *newfp; /* Ny filpekare för denna funktion */
|
||||
int answer;
|
||||
|
||||
/* Look/sök igenom hela databasen */
|
||||
for (i = 0; i<numRec; i++)
|
||||
{
|
||||
if ( strcmp(name, datap[i].name) == 0 )
|
||||
{
|
||||
/* Sätt match till 1 så att vi inte skriver ut
|
||||
om det inte finns någon match längre fram */
|
||||
match = 1;
|
||||
printHeader();
|
||||
printf("%-30s\t", datap[i].name);
|
||||
printf("%-10d\t", datap[i].quantity);
|
||||
printf("%.2f\t", datap[i].price);
|
||||
printf("\n\n");
|
||||
printf("Delete the record listed above? (y/n): ");
|
||||
|
||||
answer = getchar();
|
||||
if ( answer == 'y' )
|
||||
{
|
||||
if ( (newfp = fopen(filename, "wb")) == 0 )
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Could not open file for writing\n");
|
||||
exit(1);
|
||||
}
|
||||
/* Loopa igenom alla artiklar i databasen och skriv
|
||||
ut dem till filen igen, FÖRUTOM de som matchar
|
||||
sökordet */
|
||||
for (j = 0; j<numRec; j++)
|
||||
{
|
||||
if ( strcmp(name, datap[j].name) == 0 )
|
||||
continue;
|
||||
fwrite(&datap[j], sizeof(struct myData), 1,
|
||||
newfp);
|
||||
}
|
||||
fclose(newfp);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (match == 0)
|
||||
{
|
||||
fprintf(stderr, "Could not find %s in database\n", name);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
int new(struct myData *datap)
|
||||
{
|
||||
FILE *fp;
|
||||
int bytes;
|
||||
if ( (fp = fopen(filename, "ab")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Could not open file for writing\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Fråga efter uppgifterna för varje ny artikel och skriv ut
|
||||
artiklarna, en efter en till filen. Loopa tills användaren
|
||||
skriver 'done' som namn. */
|
||||
for (;;)
|
||||
{
|
||||
/* Sätt stdin-bufferten till NULL efter varje iteration
|
||||
(för att tömma bufferten) */
|
||||
setbuf(stdin, NULL);
|
||||
printf("Name ('done' when finished): ");
|
||||
fgets(datap->name, NAMEMAXLENGTH, stdin);
|
||||
datap->name[strcspn(datap->name, "\n")] = '\0';
|
||||
|
||||
if ( strcmp(datap->name, "done") == 0 )
|
||||
{
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
||||
printf("Quantity: "); scanf("%d", &datap->quantity);
|
||||
printf("Price: "); scanf("%f", &datap->price);
|
||||
bytes = fwrite(datap, sizeof(struct myData), 1, fp);
|
||||
if (bytes != 1)
|
||||
{
|
||||
fprintf(stderr, "Could not write to the file!\n");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void printUsage(char *arg)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s [-l] [-s name] "
|
||||
"[-m name] \n"
|
||||
"[-d name] [-n] [-h]\n\n"
|
||||
"-l = list the articles in the database\n"
|
||||
"-s name = search for an article named 'name'\n"
|
||||
"-m name = modify the article named 'name'\n"
|
||||
" You'll then have the choice to change name, quantity "
|
||||
"and price.\n"
|
||||
"-d name = delete the article named 'name'\n"
|
||||
"-n = create new articles (interactive mode only)\n"
|
||||
"-h = display this help message\n", arg);
|
||||
}
|
||||
|
||||
void printHeader(void)
|
||||
{
|
||||
int i;
|
||||
printf("\n%-30s\t", "Name");
|
||||
printf("%s\t", "Quantity");
|
||||
printf("%s\t\n", "Price");
|
||||
for (i = 0; i<=52; i++)
|
||||
printf("=");
|
||||
printf("\n");
|
||||
}
|
23
kapitel12/las-flera-flt.c
Normal file
23
kapitel12/las-flera-flt.c
Normal file
@@ -0,0 +1,23 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
/* Korrekt storlek från början på x & y */
|
||||
float y[3];
|
||||
int x[3];
|
||||
int i;
|
||||
FILE *fp;
|
||||
if ( (fp = fopen("test.bin", "rb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
fread(&y, sizeof(y), 1, fp); /* Först flyttalen */
|
||||
fread(&x, sizeof(x), 1, fp); /* Sen heltalen... */
|
||||
for (i = 0; i<3; i++)
|
||||
printf("%f\n", y[i]);
|
||||
|
||||
for (i = 0; i<3; i++)
|
||||
printf("%d\n", x[i]);
|
||||
return 0;
|
||||
}
|
25
kapitel12/las-flt-fil-ex1.c
Normal file
25
kapitel12/las-flt-fil-ex1.c
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
float y[10];
|
||||
int bytes, antal, i;
|
||||
FILE *fp;
|
||||
if ( (fp = fopen("test.bin", "rb")) == 0)
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
fseek(fp, 0, SEEK_END); /* Flytt till slutet av filen*/
|
||||
bytes = ftell(fp); /* Totala antalet bytes */
|
||||
rewind(fp); /* Flytta markören till början av filen */
|
||||
printf("Antal bytes i filen: %d\n", bytes);
|
||||
antal = bytes / sizeof(float); /* Hur många element */
|
||||
printf("Antal element: %d\n", antal);
|
||||
fread(&y, sizeof(float), antal, fp);
|
||||
/* Skriv ut alla flyttalen från filen */
|
||||
for (i = 0; i<antal; i++)
|
||||
printf("%f\n", y[i]);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
18
kapitel12/las-flt-fil.c
Normal file
18
kapitel12/las-flt-fil.c
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
float y[3];
|
||||
int i;
|
||||
FILE *fp;
|
||||
if ( (fp = fopen("test.bin", "rb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
fread(&y, sizeof(y), 1, fp);
|
||||
for (i = 0; i<3; i++)
|
||||
printf("%f\n", y[i]);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
16
kapitel12/lasa-bin-ex1.c
Normal file
16
kapitel12/lasa-bin-ex1.c
Normal file
@@ -0,0 +1,16 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *binfil;
|
||||
float x;
|
||||
if ( (binfil = fopen("flyttal.bin", "rb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kunde inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
fread(&x, sizeof(x), 1, binfil);
|
||||
printf("Flyttalet är: %f\n", x);
|
||||
fclose(binfil);
|
||||
return 0;
|
||||
}
|
14
kapitel12/lasa-fil-ex1.c
Normal file
14
kapitel12/lasa-fil-ex1.c
Normal file
@@ -0,0 +1,14 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
signed char c;
|
||||
|
||||
fp = fopen("test.txt", "r");
|
||||
while ((c = getc(fp)) != EOF)
|
||||
putchar(c);
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
32
kapitel12/lasa-fil-ex2.c
Normal file
32
kapitel12/lasa-fil-ex2.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
int strSize, readSize;
|
||||
char *buffer;
|
||||
fp = fopen("test.txt", "r");
|
||||
|
||||
/* Ta reda på storleken och återgå sen till start */
|
||||
fseek(fp, 0, SEEK_END);
|
||||
strSize = ftell(fp);
|
||||
rewind(fp);
|
||||
|
||||
/* Skapa dynamiskt minne för filens innehåll */
|
||||
buffer = calloc(sizeof(char), strSize+1);
|
||||
|
||||
/* Läs in filens innehåll och spara antalet inlästa
|
||||
tecken i 'readSize' */
|
||||
readSize = fread(buffer, sizeof(char), strSize, fp);
|
||||
|
||||
fclose(fp); /* Vi är klara med fp så stäng den */
|
||||
|
||||
printf("%s\n\n", buffer);
|
||||
printf("Storleken är %d tecken och vi läste in %d tecken\n",
|
||||
strSize, readSize);
|
||||
|
||||
free(buffer); /* Frigör det dynamiska minnet */
|
||||
|
||||
return 0;
|
||||
}
|
33
kapitel12/lasa-fil-ex3-c99.c
Normal file
33
kapitel12/lasa-fil-ex3-c99.c
Normal file
@@ -0,0 +1,33 @@
|
||||
#define _XOPEN_SOURCE 600
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#include <inttypes.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
off_t filesize;
|
||||
int fd, readSize;
|
||||
struct stat fileinfo;
|
||||
char* buffer;
|
||||
fp = fopen("test.txt", "r");
|
||||
|
||||
fd = fileno(fp); /* Hämta fildeskriptorn och spara i fd */
|
||||
fstat(fd, &fileinfo); /* Hämta all information till 'fileinfo' */
|
||||
filesize = fileinfo.st_size; /* Spara filens storlek i filesize */
|
||||
/* från 'fileinfo.st_size' */
|
||||
|
||||
buffer = calloc(sizeof(char), filesize+1);
|
||||
readSize = fread(buffer, sizeof(char), filesize, fp);
|
||||
buffer[filesize] = '\0';
|
||||
|
||||
printf("%s\n\n", buffer);
|
||||
printf("Fildeskriptor: %d\n", fd);
|
||||
printf("Filens storlek är %jd byte och vi har läst in %d byte\n",
|
||||
(intmax_t)filesize, readSize);
|
||||
|
||||
return 0;
|
||||
}
|
32
kapitel12/lasa-fil-ex3.c
Normal file
32
kapitel12/lasa-fil-ex3.c
Normal file
@@ -0,0 +1,32 @@
|
||||
#define _XOPEN_SOURCE 500
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
off_t filesize;
|
||||
int fd, readSize;
|
||||
struct stat fileinfo;
|
||||
char* buffer;
|
||||
fp = fopen("test.txt", "r");
|
||||
|
||||
fd = fileno(fp); /* Hämta fildeskriptorn och spara i fd */
|
||||
fstat(fd, &fileinfo); /* Hämta all information till 'fileinfo' */
|
||||
filesize = fileinfo.st_size; /* Spara filens storlek i filesize */
|
||||
/* från 'fileinfo.st_size' */
|
||||
|
||||
buffer = calloc(sizeof(char), filesize+1);
|
||||
readSize = fread(buffer, sizeof(char), filesize, fp);
|
||||
buffer[filesize] = '\0';
|
||||
|
||||
printf("%s\n\n", buffer);
|
||||
printf("Fildeskriptor: %d\n", fd);
|
||||
printf("Filens storlek är %ld byte och vi har läst in %d byte\n",
|
||||
(long int)filesize, readSize);
|
||||
|
||||
return 0;
|
||||
}
|
27
kapitel12/lasa-matt.c
Normal file
27
kapitel12/lasa-matt.c
Normal file
@@ -0,0 +1,27 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
int langd, bredd, hojd;
|
||||
FILE *fp;
|
||||
|
||||
/* Kontrollera först om filen finns och om inte
|
||||
avsluta programmet och skriv ett felmeddelande */
|
||||
if ( (fp = fopen("konfigfil.txt", "r")) == 0)
|
||||
{
|
||||
printf("Filen finns inte!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Läs in de olika "fälten" från filen till rätt
|
||||
variabel */
|
||||
fscanf( fp, "längd: %d, bredd: %d, höjd: %d",
|
||||
&langd, &bredd, &hojd);
|
||||
|
||||
/* Skriv ut volymen */
|
||||
printf("Lådan har en volym på %d cm3\n",
|
||||
(langd * bredd * hojd));
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
38
kapitel12/lasa-person-struct.c
Normal file
38
kapitel12/lasa-person-struct.c
Normal file
@@ -0,0 +1,38 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAXLANGD 30
|
||||
#define ANTAL 3
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
int i;
|
||||
struct minData
|
||||
{
|
||||
char fnamn[MAXLANGD];
|
||||
char enamn[MAXLANGD];
|
||||
int alder;
|
||||
};
|
||||
|
||||
struct minData personer[ANTAL];
|
||||
|
||||
if ( (fp= fopen("personer.bin", "rb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Läs in strukturen från filen */
|
||||
fread(personer, sizeof(struct minData), ANTAL, fp);
|
||||
|
||||
/* Loopa igenom alla personer i strukturen */
|
||||
for (i = 0; i<ANTAL; i++)
|
||||
{
|
||||
printf("Förnamn: %s\n", personer[i].fnamn);
|
||||
printf("Efternamn: %s\n", personer[i].enamn);
|
||||
printf("Ålder: %d\n\n", personer[i].alder);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
20
kapitel12/skriv-bin-ex1.c
Normal file
20
kapitel12/skriv-bin-ex1.c
Normal file
@@ -0,0 +1,20 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *binfil;
|
||||
float x;
|
||||
/* Kontrollera om fopen lyckades öppna filen
|
||||
i skrivläge */
|
||||
if ( (binfil = fopen("flyttal.bin", "wb")) == 0 )
|
||||
{
|
||||
/* Skriv felmeddelande till stderr */
|
||||
fprintf(stderr, "Kan inte skriva till fil\n");
|
||||
return 1;
|
||||
}
|
||||
printf("Skriv ett flyttal: ");
|
||||
scanf("%f", &x);
|
||||
fwrite(&x, sizeof(x), 1, binfil);
|
||||
fclose(binfil);
|
||||
return 0;
|
||||
}
|
18
kapitel12/skriv-fil-ex1.c
Normal file
18
kapitel12/skriv-fil-ex1.c
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
char namn1[] = "Knatte";
|
||||
char namn2[] = "Fnatte";
|
||||
|
||||
fp = fopen("test.txt", "w");
|
||||
|
||||
fprintf(fp, "%s, %s och Tjatte\n"
|
||||
"bor alla i Ankeborg.\n\n", namn1, namn2);
|
||||
fputs("Kalle och Lisa bor också i Ankeborg.\n", fp);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
18
kapitel12/skriv-flera-flt.c
Normal file
18
kapitel12/skriv-flera-flt.c
Normal file
@@ -0,0 +1,18 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
float y[3] = {3.14, 5.55, 9.56};
|
||||
int x[3] = {99, 101, 105};
|
||||
FILE *fp;
|
||||
if ( (fp = fopen("test.bin", "wb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte läsa filen\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
fwrite(&y, sizeof(y), 1, fp);
|
||||
fwrite(&x, sizeof(x), 1, fp);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
15
kapitel12/skriv-flt-fil.c
Normal file
15
kapitel12/skriv-flt-fil.c
Normal file
@@ -0,0 +1,15 @@
|
||||
#include <stdio.h>
|
||||
|
||||
int main(void)
|
||||
{
|
||||
float y[3] = {3.14, 5.55, 9.56};
|
||||
FILE *fp;
|
||||
if ( (fp = fopen("test.bin", "wb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
fwrite(&y, sizeof(y), 1, fp);
|
||||
fclose(fp);
|
||||
return 0;
|
||||
}
|
42
kapitel12/skriv-person-struct.c
Normal file
42
kapitel12/skriv-person-struct.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAXLANGD 30
|
||||
#define ANTAL 3
|
||||
|
||||
int main(void)
|
||||
{
|
||||
FILE *fp;
|
||||
struct minData
|
||||
{
|
||||
char fnamn[MAXLANGD];
|
||||
char enamn[MAXLANGD];
|
||||
int alder;
|
||||
};
|
||||
|
||||
struct minData personer[ANTAL];
|
||||
|
||||
if ( (fp = fopen("personer.bin", "wb")) == 0 )
|
||||
{
|
||||
fprintf(stderr, "Kan inte öppna filen\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Skapa tre person i strukturen */
|
||||
strcpy(personer[0].fnamn, "Kalle");
|
||||
strcpy(personer[0].enamn, "Anka");
|
||||
personer[0].alder = 31;
|
||||
|
||||
strcpy(personer[1].fnamn, "Lisa");
|
||||
strcpy(personer[1].enamn, "Anka");
|
||||
personer[1].alder = 28;
|
||||
|
||||
strcpy(personer[2].fnamn, "Fnatte");
|
||||
strcpy(personer[2].enamn, "Anka");
|
||||
personer[2].alder = 8;
|
||||
|
||||
/* Skriv ut strukturen till en fil */
|
||||
fwrite(personer, sizeof(struct minData), ANTAL, fp);
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user