Vissza

Állománykezelés

Feladatok:

1. Olvassuk ki egy tetszőleges szöveg állomány tartalmát, mely egész számokat tartalmaz, egy tömbe, majd írjunk függvényt mely meghatározza a  tömb elemei közül a maximumot. (Forráskód)

2. Adott a következő struktúrájú file: név, cim(város név), életkor, telefonszám. Hozzuk létre a filet (töltsük fel adatokkal), majd végezzük el a következő műveleteket:

Fontosabb felső szintű file kezelő függvények

FILE * fopen ( const char * fname, const char * mode);
    hiba esetén NULL pointert térít vissza

int remove (const char * filename);
    törli a megadott nevű file-t . Hiba esetén visszatérési érték 0-tól különböző .

int rename (const char * oldname, const char * newname);
    átnevezi
a megadott nevű file-t .

int    fgetc( FILE * fp);
int    fputc(char c, FILE * fp);
    karakter írás-olvasás

size_t fread(void * ptr, size_t size, size_t n, FILE *fp);
size_t fwrite(const void * ptr, size_t size, size_t n, FILE *fp);

olvasás/írás, a ptr mutatóval címzett tömb be/ből n darab size hosszúsagú csomagot, visszatérési értéke: a reálisan átvitt csomagok száma
feof() és ferror() használjuk a hibák tesztelésére

char * fgets(char * s, int n, FILE * fp);

egy szövegsort, maximum n-1 karaktert olvas, végére '\0' -t illeszt (de beolvassa a '\n' -t is a sor végére, ellentétben a gets() függvénnyel), visszatérési érték: s, illetve  NULL hiba vagy EOF esetén.

char * fputs(const char * s,  FILE * fp);

kiírja a stringet a file-ba
visszatérési értéke: pozitív egész, illetve EOF hiba esetén

int ungetc ( int c, FILE * fp );

"visszaküldi"  az utolsó olvasott karaktert a file-ba

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

a printf/scanf file szintű megfelelői

int fseek(FILE * fp, long offset, int origin);

más pozicióra lépteti a file mutatót, az új pozició helye: az origin pozició +  offset számú byte (karakter)
visszatérési értéke hiba esetén nem nulla
az origin lehet:
SEEK_SET (file eleje),
SEEK_CUR (pillanatnyi hely),
SEEK_END (file vége).

long ftell(FILE * fp);

 visszatéríti a file mutató pillanatnyi poziciójat a file-ban.
  visszatérési értéke pozitív long egész, illetve EOF hiba esetén


int fgetpos (FILE * fp, fpos_t  * ptr);
int fsetpos (FILE * fp, const fpos_t ptr);

  a két függvény az új pozicióra ugrást oldja meg együtt

int fclose(FILE * fp);

 lezárja a file-t. kiírja a buffer adatait, felszabadítja az fp-t
  visszatérési érték: 0  illetve EOF hiba esetén

int fflush( FILE * fp );

lemezre írja az fp-hez rendelt buffert. Amennyiben az fp helyett egy NULL mutatót adunk argumentumként, valamennyi irasra nyitott file bufferet kiírja. Hiba esetén a visszatérési érték EOF, egyébbként 0.

void rewind( FILE * fp );
    visszaugratja a file mutatót a file elejére
FILE * freopen( const char * path, const char * mode, FILE * fp );
    megnyitja a file-t átirányitás végett, példaul:
freopen ( "out.txt","w", stdout); átirányitja a standard kimenetre (stdout) írt adatokat a out.txt nevű, lemezen található file-ba.


Hibakezelés
int ferror (FILE * fp);
    visszatérési értéke 0  illetve más egész szám hiba esetén

int feof(FILE * fp);
     visszatérési értéke 0  illetve más egész szám EOF esetén

void perror(const char * s)

    kiírja az s stringet és az errno változóban levő kódnak megfelelő hibát.

Hibát a stderr -re  írunk, utána az exit (int n ) függvényt használjuk amennyiben a programból kell kilépni, illetve return n -et függvény esetén.


1.
#include <stdio.h>
#include <stdlib.h>

int maximum(int * tomb, int n);

void main()
{
    FILE *in;
    char nev[15];
    printf("az allomany neve:");
    scanf("%s", nev);
    in = fopen(nev, "r");
    int i, m;
    int *x = (int*)malloc(100*sizeof(int));
    if(in == NULL)
    {
        printf("Nyitasi hiba\n");
        return;
    }
    i = 0;
    while(1)
    {
        fscanf(in,"%i",&x[i]);
        if( feof(in) ) break;
        i++;
    }
    fclose(in);
    m = maximum(x,i);
    printf("A szamok maximuma: %i\n",m);
    free (x);
}

int maximum(int * tomb, int n)
{
    int i;
    int m = tomb[0];
    for (i=1; i<n; i++)
        if(m < tomb[i]) m = tomb[i];
    return m;
}

Vissza