Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, 2014. Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik



Podobne dokumenty
Funkcje zawarte w bibliotece < io.h >

Funkcje zawarte w bibliotece < io.h >

Programowanie w językach wysokiego poziomu

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Biblioteka standardowa - operacje wejścia/wyjścia

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Podstawy programowania w języku C++

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Pliki. Informacje ogólne. Obsługa plików w języku C

Pliki. Informacje ogólne. Obsługa plików w języku C

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Podstawy programowania w języku C++

Programowanie Procedurale. Pliki w języku C++

Podstawy programowania w języku C++

W języku C każdy plik fizyczny jest ciągiem bajtów, z których każdy może być niezależnie odczytany. Borland 01234

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

Argumenty wywołania programu, operacje na plikach

7 Przygotował: mgr inż. Maciej Lasota

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Wykład X. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2016 Janusz Słupik

Operacje na plikach (niskiego poziomu) < IO.H >

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Temat: Operacje na plikach. Pliki tekstowe i binarne. Faza otwarcia, zapisu/odczytu i zamknicia pliku.

Programowanie w językach

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Plik jest reprezentowany przez strumień znaków (bajtów) o zmiennej długości. Koniec strumienia identyfikowany jest znacznikiem końca pliku EOF.

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

4. Pliki Informacje ogólne o dostępie do plików w PHP Sprawdzanie istnienia pliku file_exists()

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

PRZYKŁADY OPERACJI PLIKOWYCH z wykorzystaniem biblioteki <stdio.h>

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

MATERIAŁY POMOCNICZE PODSTAWY PROGRAMOWANIA Na podstawie: Programowanie w C - Stworzone na Wikibooks, bibliotece wolny podręczników

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Wskaźniki. Informatyka

Strumienie i pliki. Programowanie Proceduralne 1

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

Programowanie Proceduralne

Wskaźniki. Programowanie Proceduralne 1

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

C Operacje na plikach

wer. 7 z drobnymi modyfikacjami Wojciech Myszka :48:

ISO/ANSI C dostęp do plików ISO/ANSI C. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików. ISO/ANSI C dostęp do plików

x szereg(x)

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Inne darmowe! kompilatory języka C działające m.in. po systemem WINDOWS:

Podstawy programowania w języku C++

Ghost in the machine

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Język ANSI C tablice wielowymiarowe

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

Tablice, funkcje - wprowadzenie

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

PODSTAW PROGRAMOWANIA WYKŁAD 7 ŁAŃCUCHY

Operacje wejścia/wyjścia (odsłona druga) - pliki

Tablice w argumentach funkcji. Tablicy nie są przekazywane po wartości Tablicy są przekazywane przez referencje lub po wskaźniku

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Struktury. Przykład W8_1

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

wykład III uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - zarządzanie pamięcią, struktury,

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

Część 4 życie programu

Wstęp do Programowania, laboratorium 02

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

1 Przetwarzanie plików

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Wskaźniki w C. Anna Gogolińska

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Ćwiczenie 7. Strumień trójelementowy. A g a EOF... EOF... Wprowadzenie do programowania w języku C. Wskaźnik bieżącej pozycji. bieżącej pozycji.

Spis treści JĘZYK C - PLIKI BINARNE. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF30

dr inż. Jarosław Forenc

Języki i metodyka programowania. Wprowadzenie do języka C

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, Białystok

Programowanie Proceduralne

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Metodyka i Technika Programowania 1

Ćwiczenie nr 8. Temat: Operacje na plikach - zapis i odczyt danych.

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

WYKŁAD 4, 5 i 6. Wprowadzenie do języka C Mój pierwszy, drugi,..., n-ty program w języku C. Programy: c1_1.c... c1_9.c.

typ_zwracanej_wartości nazwa_funkcji(lista deklaracji argumentów) { ciało(treść) funkcji return Val; //zwracana wartość }

Spis treści PLIKI BINARNE W JĘZYKU C. Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF23

Stałe i zmienne znakowe. Stała znakowa: znak

Politechnika Białostocka, Wydział Elektryczny, Katedra Elektrotechniki Teoretycznej i Metrologii ul. Wiejska 45D, Białystok

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Stałe, tablice dynamiczne i wielowymiarowe

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Transkrypt:

Wykład VI Wydział Matematyki Stosowanej Politechniki Śląskiej Gliwice, 2014 c Copyright 2014 Janusz Słupik

Operacje na plikach

Operacje na plikach Aby móc korzystać z pliku należy go otworzyć w odpowiednim trybie. Opcje: b - tryb binarny w - tryb zapisu r - tryb czytania a - tryb dopisywania FILE *plik; plik = fopen( "nazwa.txt", "r" ); if( plik == NULL ) printf( "Nieudane otwarcie" ); else... fclose( plik );

Funkcje zapisu FILE *plik; int x = 5; char nazwa[] = "dane.txt"; plik = fopen( nazwa, "w" ); fputc( A, plik ) ; fputs( "napis", plik ); fprintf( plik, "x= %d", x );

Funkcje odczytu FILE *plik; char linia[100]; int z; plik = fopen( "dane.txt", "r" ); z = fgetc( plik ); fgets( linia, 100, plik ); fscanf( plik, "%d", &z );

Przykład - kopia pliku bajt po bajcie FILE *wej, *wyj; int z; wej = fopen( "jeden.cos", "rb" ); if( wej == NULL ) printf("\nnieudane otwarcie pliku do kopiowania\n"); else wyj = fopen( "kopia.cos", "wb" ); while(1) z = fgetc( wej ); if( z == EOF ) break; fputc( z, wyj ); fclose( wej ); fclose( wyj );

Pozycjonowanie w pliku int poz; poz = ftell( plik ); //aktualna pozycja fseek( plik, 5, SEEK_CUR ); //przesuń o 5 bajtów SEEK CUR - względem aktualnej pozycji w pliku SEEK SET - względem początku pliku SEEK END - względem końca pliku fseek( plik, 0, SEEK_END); //przesuń na koniec fseek( plik, 0, SEEK_END); liczba = ftell( plik ); rewind( plik ); //liczba bajtów w pliku //"przewiń" do początku

Zapis/odczyt bloku pamięci Wczytanie pod wskazany adres podanej liczby elementów określonego rozmiaru z pliku. Zwraca liczbę poprawnie wczytanych elementów. fread( wskaźnik, rozmiar_elementu, liczba, plik ); Zapisanie spod wskazanego adresu podanej liczby elementów określonego rozmiaru do pliku. Zwraca liczbę zapisanych elementów jeśli zapis był poprawny. fwrite( wskaźnik, rozmiar_elementu, liczba, plik );

Przykład - tablica w pliku Zapis: FILE *wyj; int t[10] = 1,2,3,4,5,6,7,8,9,10; wyj = fopen( "tab.dat", "wb" ); fwrite( (void *) t, sizeof(int), 10, wyj ); fclose(wyj); Odczyt: int u[10]; wej = fopen( "tab.dat", "rb" ); fread( (void *) u, sizeof(int), 10, wej ); fclose(wej);

Przykład - ładowanie całego pliku do pamięci main() char *p = NULL; int n = 0; n = wczytajplik( "main.c", &p ); if( n ) // Przykładowe użycie: // Wypisanie na ekranie zawartości pliku od końca while( --n >= 0 ) printf("%c", p[n] ); free( p ); system("pause"); return 0;

Przykład c.d. - ładowanie całego pliku do pamięci int wczytajplik( char *nazwapliku, char **gdzie ) FILE *plik; int rozmiar = 0, z = 0, i = 0; plik = fopen( nazwapliku, "rb" ); if( plik == NULL ) return 0; fseek( plik, 0, SEEK_END ); rozmiar = ftell( plik ); fseek( plik, 0, SEEK_SET ); *gdzie = malloc( rozmiar ); if( *gdzie == NULL ) return 0; while(1) if( ( z = fgetc(plik) ) == EOF ) break; *( *gdzie + i ) = z; i++; fclose( plik ); return rozmiar;

Przykład 2. Prosta kompresja danych.

Idea kompresji - zmodyfikowana metoda ByteRun Plik źródłowy: a a a b b b b b c d a c b b b Sekwencje powtarzających się symboli kodujemy: ilość znak gdzie ilość to bajt zawierający liczbę: 2... 127 Sekwencje różnych symboli kodujemy: -ilość z1 z2... zn gdzie -ilość to bajt zawierający liczbę: -128... -1 Po zakodowaniu: 3 a 5 b -4 c d a c 3 b

Plik BMP Plik BMP składa się z nagłówków oraz danych opisujących poszczególne piksele. W 24 bitowej bitmapie każdemu pikselowi przypisane są 3 bajty. Każdy wiersz tablicy pikseli jest wyrównany do wielokrotności 4 bajtów. nagłówki piksel piksel... b1 b2... bn r1 g1 b1 r2 g2 b2...

Przykład - Prosty kompresor plików BMP Założenia: - plik poddawany kompresji jest w formacie BMP, - obraz nie jest fotografią, lecz grafiką: diagramem, banerem, komiksem, itp. - kompresowanie: program.exe -k plik.bmp nowy.bin - dekompresowanie: program.exe -d nowy.bin plik.bmp Idea kompresji: - zastosujemy zmodyfikowaną metodę ByteRun; - będziemy badali sekwencje pojedynczych bajtów. Dla obrazów w postaci 24 bitowej można polepszyć stopień kompresji badając nie pojedyncze bajty lecz ich trójki, aby wykryć powtarzające się piksele. Jednakże ze względu na stopień złożoności kodu nie będziemy tego implementować w ten sposób.

main( int argc, char *argv[] ) char *p = NULL; int n; if( argc > 3 ) n = wczytajplik( argv[2], &p ); if( n ) if( strcmp( argv[1], "-k" ) == 0 ) kompresuj( argv[3], p, n ); else dekompresuj( argv[3], p, n ); free( p ); system("pause"); return 0;

Przed funkcją main: #include <stdio.h> #include <stdlib.h> int wczytajplik( char *, char ** ); void kompresuj( char *, char *, int ); void dekompresuj( char *, char *, int ); void zapiszpowtorzenia( FILE *, int, char ); void zapiszrozneznaki( FILE *, int, char * ); //...

void dekompresuj( char *nazwapliku, char *t, int n ) int pozycjaodczytu = 0, krotnosc = 0; FILE *plik = NULL; plik = fopen( nazwapliku, "wb" ); while( pozycjaodczytu < n ) krotnosc = t[ pozycjaodczytu++ ]; if( krotnosc < 0 ) krotnosc *= (-1); while( krotnosc-- ) fputc( t[ pozycjaodczytu++ ], plik ); else while( krotnosc-- ) fputc( t[ pozycjaodczytu ], plik ); pozycjaodczytu++; fclose( plik );

void zapiszpowtorzenia( FILE *plik, int ile, char znak ) while( 1 ) if( ile > 127 ) fputc( 127, plik ); ile -= 127; fputc( znak, plik ); else fputc( ile, plik ); fputc( znak, plik ); break;

void zapiszrozneznaki( FILE *plik, int ile, char *t ) int i; while( 1 ) if( ile > 128 ) fputc( -128, plik ); for( i=0; i<128; i++ ) fputc( *t++, plik ); ile -= 128; else fputc( ile*(-1), plik ); while( ile-- > 0 ) fputc( *t++, plik ); break;

void kompresuj( char *nazwapliku, char *t, int n ) char znak = t[0]; int pozycjaodczytu = 1; int iloscpowtorzen = 0, iloscroznic = 0; FILE *plik = fopen( nazwapliku, "wb" ); while( pozycjaodczytu < n ) while( pozycjaodczytu < n ) // szukamy kolejnych powtorzeń if( znak == t[ pozycjaodczytu ] ) iloscpowtorzen++; pozycjaodczytu++; else break; if( iloscpowtorzen > 0 ) zapiszpowtorzenia( plik, ++iloscpowtorzen, znak ); iloscpowtorzen = 0; if( pozycjaodczytu+1 < n ) znak = t[ pozycjaodczytu++ ]; //...

//... // szukamy ile jest kolejnych różnych znaków while( pozycjaodczytu+iloscroznic < n ) if( znak!= t[ pozycjaodczytu + iloscroznic ] ) znak = t[ pozycjaodczytu + iloscroznic++ ]; else break; if( iloscroznic > 0 ) if( pozycjaodczytu + iloscroznic == n ) iloscroznic++; zapiszrozneznaki( plik, iloscroznic, t+pozycjaodczytu-1); pozycjaodczytu += iloscroznic; iloscroznic = 0; fclose( plik );

Przykładowe dane: plik pogoda.bmp o rozmiarze 1 128 654 bajtów Po kompresji ma 656 825 bajtów.

Solucja w VS2008 zawierająca pełny kod tego programu znajduje się pod adresem: http://157.158.16.139/js/wyklady/solucje/kompresorbmp.zip

Koniec