P12-1
/* licz.c -- korzystanie ze standardowego we/wy */
#include <stdio.h>
#include <stdlib.h> /* prototyp funkcji exit() */
int main(int argc, char *argv[])
{
int ch; /* przechowuje kolejne odczytywane znaki */
FILE *wp; /* "wskaznik plikowy" */
long licznik = 0;
if (argc != 2)
{
printf("Sposob uzycia: %s nazwa_pliku\n", argv[0]);
exit(1);
}
if ((wp = fopen(argv[1], "r")) == NULL)
{
printf("Nie mozna otworzyc %s\n", argv[1]);
exit(1);
}
while ((ch = getc(wp)) != EOF)
{
putc(ch,stdout);
licznik++;
}
fclose(wp);
printf("Plik %s zawiera %ld znakow\n", argv[1], licznik);
return 0;
}
P12-2
/* reduktor.c -- zmniejsza rozmiar Twoich plikow o dwie trzecie ! */
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* dla strcpy(), strcat() */
int main(int argc, char *argv[])
{
FILE *we, *wy; /* deklaracja 2 wskaznikow plikowych */
int ch;
char nazwa[40]; /* pamiec dla nazwy pliku wyjsciowego */
int licznik = 0;
if (argc < 2) /* sprawdza obecnosc argumentu */
{
fprintf(stderr, "Sposob uzycia: %s nazwa_pliku\n", argv[0]);
exit(1);
}
if ((we = fopen(argv[1], "r")) == NULL)
{
fprintf(stderr, "Nie moglem otworzyc pliku \"%s\".\n",
argv[1]);
exit(2);
}
strcpy(nazwa,argv[1]); /* kopiuje nazwe pliku do tablicy */
strcat(nazwa,".red"); /* dodaje .red do nazwy */
if ((wy = fopen(nazwa, "w")) == NULL)
{ /* otwiera plik do zapisu */
fprintf(stderr,"Nie mozna utworzyc pliku wyjsciowego.\n");
exit(3);
}
while ((ch = getc(we)) != EOF)
if (licznik++ % 3 == 0)
putc(ch, wy); /* wyswietla co trzeci znak */
if (fclose(we) != 0 || fclose(wy) != 0)
fprintf(stderr,"Blad przy zamykaniu plikow.\n");
return 0;
}
P12-3
/* dodajsl.c -- korzysta z wprintf(), fscanf() i rewind() */
#include <stdio.h>
#include <stdlib.h>
#define MAX 40
int main(void)
{
FILE *wp;
char slowa[MAX];
if ((wp = fopen("slowka", "a+")) == NULL)
{
fprintf(stdin,"Nie moge otworzyc pliku \"slowka\".\n");
exit(1);
}
puts("Podaj slowa, ktore maja zostac dodane do pliku;");
puts("Aby zakonczyc, wcisnij Enter na poczatku wiersza.");
while (gets(slowa) != NULL && slowa[0] != '\0')
fprintf(wp, "%s ", slowa);
puts("Zawartosc pliku:");
rewind(wp); /* przejdz do poczatku pliku */
while (fscanf(wp,"%s",slowa) == 1)
puts(slowa);
if (fclose(wp) != 0)
fprintf(stderr,"Blad przy zamykaniu pliku.\n");
return 0;
}
P12-4
/* echo.c -- korzystanie z fgets() i fputs() */
#include <stdio.h>
#define MAXWIERSZ 20
int main(void)
{
char wiersz[MAXWIERSZ];
while (fgets(wiersz, MAXWIERSZ, stdin) != NULL &&
wiersz[0] != '\n')
fputs(wiersz, stdout);
return 0;
}
P12-5
/* odwroc.c -- wyswietla zawartosc pliku w odwrotnej kolejnosci */
#include <stdio.h>
#include <stdlib.h>
#define CNTL_Z '\032' /* znacznik EOF w plikach tekstowych DOS */
#define DLAN 50
int main(void)
{
char plik[DLAN];
char ch;
FILE *wp;
long licznik, koniec;
puts("Podaj nazwe pliku:");
gets(plik);
if ((wp = fopen(plik,"rb")) == NULL)
{ /* tryb binarny tylko do odczytu */
printf("Nie moge otworzyc %s\n", plik);
exit(1);
}
fseek(wp, 0L, SEEK_END); /* przejdz do konca pliku */
koniec = ftell(wp);
for (licznik = 1L; licznik <= koniec; licznik++)
{
fseek(wp, -licznik, SEEK_END); /* idz do tylu */
ch = getc(wp);
/* dla DOS-u, dziala w UNIXie */
if (ch != CNTL_Z && ch != '\r')
putchar(ch);
/* dla Macintosha */
/* if (ch == '\r')
putchar('\n');
else
putchar(ch); */
}
putchar('\n');
fclose(wp);
return 0;
}
P12-6
/* dopisz.c -- dopisuje pliki do pliku */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ROZMIAR_BUF 1024
#define DLAN 50
char temp[ROZMIAR_BUF];
void dopisz(FILE *zrodlo, FILE *cel);
int main(void)
{
FILE *pd, *pz;
int pliki = 0;
char plik_doc[DLAN];
char plik_zro[DLAN];
puts("Podaj nazwe pliku docelowego:");
gets(plik_doc);
if ((pd = fopen(plik_doc, "a")) == NULL)
{
fprintf(stderr, "Blad otwarcia %s\n", plik_doc);
exit(2);
}
if (setvbuf(pd, NULL, _IOFBF, ROZMIAR_BUF) != 0)
{
fputs("Nie mozna utworzyc bufora wyjsciowego\n", stderr);
exit(3);
}
puts("Podaj nazwe pierwszego pliku zrodlowego (pusty wiersz konczy program):");
while (gets(plik_zro) && plik_zro[0] != '\0')
{
if (strcmp(plik_zro, plik_doc) == 0)
fputs("Nie mozna dopisac pliku do siebie\n",stderr);
else if ((pz = fopen(plik_zro, "r")) == NULL)
fprintf(stderr, "Blad otwarcia pliku %s\n", plik_zro);
else
{
if (setvbuf(pz, NULL, _IOFBF, ROZMIAR_BUF) != 0)
{
fputs("Nie mozna utworzyc bufora wejsciowego\n",stderr);
continue;
}
dopisz(pz, pd);
if (ferror(pz) != 0)
fprintf(stderr,"Blad odczytu pliku %s\n",
plik_zro);
if (ferror(pd) != 0)
fprintf(stderr,"Blad zapisu pliku %s\n",
plik_doc);
fclose(pz);
pliki++;
printf("Plik %s dopisany.\n", plik_zro);
puts("Kolejny plik (pusty wiersz konczy program):");
}
}
printf("Koniec. Dopisano %d plikow.\n", pliki);
fclose(pd);
return 0;
}
void dopisz(FILE *zrodlo, FILE *cel)
{
size_t bajty;
extern char temp[]; /* korzysta z tablicy zewn. temp */
while ((bajty = fread(temp,sizeof(char),ROZMIAR_BUF,zrodlo)) > 0)
fwrite(temp, sizeof (char), bajty, cel);
}
P12-7
/* swobin.c -- dostep swobodny, binarne we/wy */
#include <stdio.h>
#include <stdlib.h>
#define DL_TAB 1000
int main()
{
double liczby[DL_TAB];
double wartosc;
const char * plik = "liczby.dat";
int i;
long poz;
FILE *plikwewy;
/* tworzy zestaw wartosci typu double */
for(i = 0; i < DL_TAB; i++)
liczby[i] = 100.0 * i + 1.0 / (i + 1);
if ((plikwewy = fopen(plik, "wb")) == NULL)
{
fprintf(stderr, "Blad otwarcia pliku %s do zapisu.\n", plik);
exit(1);
}
/* zapisuje tablice do pliku w formacie binarnym */
fwrite(liczby, sizeof (double), DL_TAB, plikwewy);
fclose(plikwewy);
if ((plikwewy = fopen(plik, "rb")) == NULL)
{
fprintf(stderr,
"Blad otwarcia pliku %s do dostepu swobodnego.\n", plik);
exit(1);
}
/* odczytuje z pliku wybrane pozycje */
printf("Podaj indeks z przedzialu 0-%d.\n", DL_TAB - 1);
scanf("%d", &i);
while (i >= 0 && i < DL_TAB)
{
poz = (long) i * sizeof(double); /* oblicza offset */
fseek(plikwewy, poz, SEEK_SET); /* przechodzi w odp. miejsce */
fread(&wartosc, sizeof (double), 1, plikwewy);
printf("Wartosc pod tym indeksem to %f.\n", wartosc);
printf("Kolejny indeks (wyjscie poza przedzial konczy program):\n");
scanf("%d", &i);
}
fclose(plikwewy);
puts("Na razie!");
return 0;
}
DANE-WE
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 2 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 5 2 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 1 9 8 5 4 5 2 0 0 0 0 0 0 0 0 0
0 0 0 0 9 0 0 0 0 0 0 0 5 8 9 9 8 5 0 4 5 2 0 0 0 0 0 0 0 0
0 0 9 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 4 5 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 1 8 5 0 0 0 4 5 2 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 4 5 2 0 0 0 0 0
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
9 9 9 9 0 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 3 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 5 8 9 9 8 5 8 8 8 8 8 8 8 8 8 8 8 8
5 5 5 5 5 5 5 5 5 5 5 5 5 8 9 9 8 5 5 5 5 5 5 5 5 5 5 5 5 5
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 2 2 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 3 3 0 0 0 0 0 0 5 8 9 9 8 5 0 5 6 1 1 1 1 6 5 0 0 0
0 0 0 0 4 4 0 0 0 0 0 0 5 8 9 9 8 5 0 0 5 6 0 0 6 5 0 0 0 0
0 0 0 0 5 5 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 6 6 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 5 8 9 9 8 5 0 0 0 0 0 0 0 0 0 0 0 0
DANE-WY
# *%##%*'
# *%##%**'
*%.#%*~*'
# *%##%* ~*'
# *%##%* ~*'
*%#.%* ~*'
*%##%* ~*'
*************%##%*************
%%%%%%%%%%%%*%##%*%%%%%%%%%%%%
#### #################:#######
%%%%%%%%%%%%*%##%*%%%%%%%%%%%%
*************%##%*************
*%##%*
*%##%* ==
'' *%##%* *= =*
:: *%##%* *=....=*
~~ *%##%* *= =*
** *%##%* ==
*%##%*
*%##%*