Napisz program, który będzie wczytywał dane z jednego pliku tekstowego i zmienione zapisywał do drugiego. W tym celu:
- Zadeklaruj strukturalny typ danych
struct para
zdefiniowany tak, że zmienna takiego typu może przechowywać dwie wartości: napis oraz liczbę. W funkcjimain
zadeklaruj lokalną tablicę o długości 5, zawierającą elementy typustruct para
. - Napisz funkcję
wiersz
, która będzie odczytywała dane z jednego wiersza w już otwartym pliku. W wierszu zapisane są kolejno: nr indeksu studenta, nazwisko i ocena. Funkcja odczytuje dane z jednego wiersza, następnie ignoruje odczytany nr indeksu a do komórki tablicy wpisuje w odpowiednich polach tylko nazwisko i ocenę. Przyjmij, że w pliku może być dowolna liczba wierszy (jest możliwe również, że plik jest pusty), ale nie większa niż rozmiar tablicy. Przyjmij też, że dane w pliku są zawsze poprawne, tj. wiersz zawsze zawiera trójkę prawidłowych napisów w tej samej kolejności: numer, nazwisko i ocena.
Nagłówek funkcji ma wyglądać tak:
int wiersz(FILE* f, struct para *p)
gdzief
to wskaźnik do otwartego pliku, natomiastp
to wskaźnik do komórki tablicy, do której mają zostać zapisane dane z jednego odczytanego wiersza pliku. Funkcja zwraca wartość zero, jeżeli odczyt zakończył się pomyślnie, a wartość 1, jeżeli nie udało się odczytać kolejnej porcji danych ze względu na koniec pliku. - W funkcji
main
pobierz od użytkownika nazwę pliku z danymi oraz nazwę pliku wyjściowego. Otwórz plik z danymi w trybie do odczytu, a plik wynikowy w trybie do zapisu. Następnie w pętli za pomocą funkcjiwiersz
odczytaj kolejne wiersze pliku zapisując dane w kolejnych komórkach tablicy. Każdą odczytaną komórkę tablicy zapisz od razu do pliku wynikowego tak, aby w kolejnych wierszach pliku znalazły się pary: nazwisko i ocena. Uwaga: nazwisko należy zapisać do pliku w postaci zaszyfrowanej, tj. należy zastąpić wszystkie samogłoski znakiem '*’. Jeżeli nie wszystkie komórki tablicy zostały zapełnione danymi, zapisz do pliku tylko tyle, ile zostało odczytanych z pliku wejściowego. Po zakończeniu pętli zamknij pliki, wyświetl w oknie konsoli zawartość tablicy i zakończ działanie funkcjimain
.
Uwaga: kod odczytujący dane z pliku napisz w dwóch wariantach: kiedy użytkownik na koniec ostatniego wiersza pliku wejściowego dodał znak nowej linii oraz kiedy go nie dodał (zobacz slajdy 100-103, wykład 3). Na początku funkcjimain
użytkownik określa, który wariant wybiera, tj. wskazuje czy plik wejściowy ma na końcu ostatniej linii znak nowej linii czy nie. - Przygotuj sobie odpowiednie dwa pliki tekstowe z prawidłowymi danymi wejściowymi w kilku wierszach i umieść je we właściwym folderze. Następnie przetestuj program. Zobacz jak zachowa się twój program, kiedy wskażesz niepoprawnie wariant pliku wejściowego.
Do obsługi plików wykorzystaj funkcje: fopen
, fclose
, fprintf
, fscanf
i feof
. Wszystkie z biblioteki: stdio.h
.
Przetestowany, działający program (tylko plik z kodem źródłowym) uploaduj do https://e.uksw.edu.pl jako rozwiązanie zadania „Wejściówka” w sekcji „Temat 4”.
Różne przykłady zadań i problemów dotyczących tego rodzaju zastosowań można znaleźć w podręcznikach lub na forach, których tematem jest programowanie w ANSI C (np. Zadania z programowania w języku C/C++, cz. I, rozdział 8). Dobre słowa kluczowe dla wyszukiwarki na najbliższy tydzień to: fopen
, fclose
, fprintf
, fscanf
i feof
w połączeniu z ansi c
. Oczywiście niczego nie należy brać bezkrytycznie, każdy kawałek kodu warto zweryfikować wklejając do okna VC++ i sprawdzając, jak naprawdę działa.
Hint:
Przygotowując się na lab. nr 4 warto przypomnieć sobie jak skonstruowany jest C-napis, sprawdzić jak działa szyfr Cezara, oraz zapoznać się z funkcjami:
int isalpha(int c)
int islower(int c)
int isupper(int c)
int tolower(int c)
int toupper(int c)
Funkcje znajdują się w bibliotece ctype.h
i służą do sprawdzania, czy dany znak jest literą i jakiego rodzaju (dużą czy małą) oraz do zamiany dużych liter na małe i małych na duże. Zadania pierwszego poziomu na lab. 4 mogą mieć wspólne fragmenty z zadaniami poziomu 2 lab. nr 3, tj. będą dotyczyły konwertowania napisów do postaci zaszyfrowanych wg różnych reguł, oraz oczywiście będą dotyczyły pracy na plikach tekstowych (materiał ostatnio omawiany na wykładzie).