Zajęcia 9 (21/01/2014)

Biblioteka

#include <stdio.h>

Strumień - zmienna typu

FILE* f;

Otwieranie i zamykanie strumienia

FILE *fopen(char *nazwapliku, char *tryb);
int fclose (FILE *plik);

Tryb: „r” - odczyt, „w” - zapis, „a” - dopisanie na końcu.

Odczyt i zapis formatowany (plik tekstowy)

int fscanf(FILE *plik,  char *format, ...);
int fprintf(FILE *plik, char *format, ...);

Odczyt całej linii/łańcucha znakowego tekstu z pliku

char * fgets ( char *str, int num, FILE *plik);

Odczyt i zapis pojedynczego znaku

int fgetc(FILE *p);
int fputc(char znak, FILE* plik);

Wykrywanie błędów (koniec pliku)

int feof(FILE *plik);

Więcej informacji o funkcjach biblioteki stdio.h

Przykład 1 - Czytanie sekwencji znaków z pliku

#include<stdio.h>
 
int main()
{
   FILE *plik = NULL;
   int znak;
 
   plik = fopen( "plik.txt", "r" );
   if( plik == NULL )
   {
      printf("Wystapil blad otczytu pliku\n");
      return 1;
   }
 
   while( feof(plik) == 0 )
   {
      znak = fgetc(plik);
      if (znak != EOF) printf("%c", znak);
   }
   fclose( plik );
 
   return 0;
}

Plik źródłowy: odczyt.c
Przykładowy tekst: plik.txt

Zmodyfikuj powyższy przykład tak aby tekst z pliku plik.txt został sformatowany na ekranie w taki sposób, że każdy wiersz będzie zawierał N znaków. Wartość N podaje użytkownik.

Dane: liczba całkowita N oraz plik z tekstem
Wynik: zawartość pliku wyświetlona na ekranie, gdzie wiersze mają długość N znaków.

Przykład

n=2
Th
e 
or
ig
in
 o
f  
C
is
...

Napisz program, który wyświetli ilość wystąpień każdej litery alfabetu (od a do z) angielskiego w pewnym pliku tekstowym. Program powinien nie rozróżniać wielkości liter, tzn. znak a oraz znak A traktowany jest jako ta sama litera alfabetu. Dodatkowo, niech uzyskany wynik będzie zapisany do pliku o nazwie wynik.txt.

Dane: pewien plik z tekstem
Wynik: zastaw liter alfabetu wraz z liczbami wystąpień

Przykład

A   95
B   24
C   44
D   43
E   161
F   25
G   43
H   46
I   89
...

Możliwe rozszerzenia - wyłącznie dla chętnych

  • Niech program prosi o podanie nazwy pliku do analizy
  • Nie program, obok liczby wystąpień, wyświetla częstość (w procentach) wystąpienia danej litery alfabetu w stosunku do wszystkich liter alfabetu
  • Niech program wyświetla wynik w kolejności od najczęściej występującego znaku do najrzadziej występującego

Napisz funkcję o nazwie czytaj_liczby, która ze strumienia czyta sekwencję liczb całkowitych i umieszcza je w tablicy.

Argumenty funkcji: strumień p (wskaźnik do pliku otworzonego do odczytu), tablica t oraz liczba całkowita n
Działanie: po wykonaniu funkcji tablica t zawiera liczby całkowite wczytane ze strumienia p. Liczba n ogranicza ilość wczytywanych liczb, na wypadek, gdyby w strumieniu znajdowało się ich więcej niż n. Jeżeli w strumieniu jest mniej liczb niż n wówczas w tablicy zostaną umieszczone wszystkie liczby ze strumienia.
Wartość zwracana: Wartością zwracaną funkcji jest liczba całkowita oznaczająca liczbę popranie wczytanych liczb ze strumienia.

Napisz program, który wykorzysta funkcję czytaj_liczby do pobrania n pierwszych liczb z pliku tekstowego zawierającego ciąg liczb całkowitych. Liczbę n oraz nazwę pliku wejściowego podaje użytkownik. Następnie, program wyznacza sumę wczytanych do tablicy liczb i zapisuje do pliku o nazwie wynik.txt uzyskany wynik w następującej formie:

Nazwa pliku: liczby.txt 
n=100 
suma=321

Zakładamy, że liczby w pliku wejściowym umieszczone są w osobnych wierszach. Przykładowy plik: liczby.txt

Napisz program, który korzystając z funkcji fgets czyta pewien plik tekstowy linia po linii (zakładamy, że długość linii nie przekracza 500 znaków). Następnie, dla każdej wczytanej linii, za pomocą funkcji wordcount z poprzednich zajęć, program wyznacza ilość wyrazów i zapisuje wynikową liczbę do pliku wynik.txt. Dodatkowo na końcu pliku zapisywana jest liczba całkowita wszystkich wyrazów z tekstu.

Wejście programu: plik z tekstem
Wyjście programu: plik zawierający ilości wyrazów w każdej linii pliku wejściowego oraz sumaryczną liczbę wyrazów

Przykładowy plik wejściowy:

The origin of C is closely tied to 
the development of the Unix operating system, 
originally implemented in assembly language on 
a PDP-7 by Ritchie and Thompson, incorporating 
several ideas from colleagues. 

Wynik zapisany do pliku wyjściowego

8
7
6
7
4
32