IO.H (Schuszter k. 10.2 fejezet) alacsony szintű file kez.
STDIO.H (Schuszter k. 10.2.2 fejezet) magas szintű file kez.
·
A pr. Eszközfüggetlen. (
· Az adatátvitel egysége: BYTE. , de a C-ben helyette CHAR-t mondanak, mivel char típusú változó létezik.
· Szám. Hanyadik byte-on vagyunk. (0-val kezd). Abszolút és relatív módon léptethetünk.
· SEEK_SET=0 eleje; SEEK_CUR=1 aktuális; SEEK _END=2 file vége
· Szöveg filek sorvége CR+LF. Történelem.
· A C-ben csak a CR kód a \n.
· Ezért, ha szöveg file-nél beolvasásnál levágjuk, kiírásnál betsszük. Bináris filenál nem figyeljük ezeket a karaktereket. Tehát file megnyitáskor a kezelési módot meg kell mondani. Az alapértelmezés (ha nem mondjuk meg) a szöveges.
A filet egydimenziós karaktertömbnek tekinti. A mutató byteonként lépeget.
· 0= terminál
· 1=képernyő
· 2=hibakimenet (képernyő)
· 3=COM1
· 4=LPT1 (printer)
open close read write lseek tell sizeof |
Nyit - Zár Olvas – Fájlba ír pozicióra áll, aktuális poz? |
· saját pufferrel dolgozik ezáltal sok filenel gyorsabb, de több memória kell neki. A saját puffer miatt lehet pl printf() is.
· Bő a fv választék. (pl formátumozott kiiratás, beolvasás stb.)
· Fopen, fclose, getc, putc, fprintf, fscanf, fseek, ftell
int creat (const char *path, |
létrehoz, vagy felülír adott módú hozzáf.
joggal Siker: file leíró
tömb sorszáma Hiba: -1 |
|
int open(const char *filenev, int fh; fh=open(FNEV,
O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IWRITE|S_IREAD); |
file aktiválás paraméterezve (ir
és/vagy olvas) fizikai név èlogikai név mode: O_RDONLY csak olvasásra, attrib: ha volt O_CREAT csak akkor kell! Hiba: -1 |
|
long lseek(int file1, |
File pozíció állítása. offset: ennyi byte-al mozgatjuk (előjelesen) az origin -ban közölt pozíciótól Siker: file pozíció (byte szám a file elejétől) Hiba: -1L |
|
int close (int file1) |
|
io.h |
int read (fh ,memória cím, hossz byteokban) |
len db byte-ot olvas a memóriába
a buf cimre. Siker: byte szám, Hiba: -1 |
io.h |
int write (fh ,memória cím, write(fh,&f,4); |
len db byte-ot ír a memóriábol a buf cimtől Siker: byte szám, Hiba: -1 |
|
int eof (int file1) |
|
io.h |
long int tell (int file1) |
Linux alatt nincs ez a függvény! (Csak windows alatt van.) Siker: aktuális
file pozíció Hiba: -1 |
|
//Mohos Pál alacsony fájlkezelés kidolgozott
példaprogramja.
#include <stdlib.h> // exit()
függvény miatt
#include <fcntl.h> // open(),
close(), write(), read() ... miatt
#include <sys/stat.h> // S_IREAD, S_IWRITE és egyéb módok definiálása
található itt
#include <stdio.h> // SEEK_SET és társainak
definiálatlan található itt
#include <io.h> // Linux alatt nem kell.
#include <string.h>
#define FN "1.txt"
#define BHOSSZ 257 //256. bájt után a stringzárónak
1 bájt hely kell
int main() {
int fh,a,szlo; //fn=fájl puffer sorszám
char s[]="AB\nD", b[BHOSSZ];
//******************************Fájlba ír
*************************
fh=open(FN,O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IREAD|S_IWRITE); //Fájl
nyitás
a=write(fh,s,strlen(s)); //s string fájlba
(pufferbe) tétele.
close(fh); //Puffer ürítése a fájlba.
//******************************Fájlból kiíratása
karakterenként***********
printf("\n");
fh=open(FN,O_RDONLY|O_BINARY); //mutató a fájl elejére áll.
while(!eof(fh)) //karakterenként olvas-ír. Ez lassú!
{read(fh,&a,1); putchar(a); };
//---------------------------------------Fájlból kiíratása tömbönként-------------
printf("\n");lseek(fh,0,0);//mutató a fájl elejére áll.
while(!eof(fh))
{a=read(fh,b,BHOSSZ-1); b[a]=0; puts(b);}
close(fh);
//******************************Fájl végére írja a fájl hosszát int típusban lseek()***********
fh=open(FN,O_RDWR|O_BINARY);a=0;//Fontos a
O_BINARY. Miért?
a=lseek(fh,0,2);a=a+sizeof(a); //lseek
az aktuális fájlmutatót adja az a-nak.
szlo=write(fh,&a,sizeof(a));
close(fh);
//----------------------------------tell()--------------------
fh=open(FN,O_RDWR|O_APPEND|O_BINARY);a=0;
lseek(fh,0,2);a=tell(fh);a=a+sizeof(a); // a fájl végére állok. Ott
kiolvasom a mutató értékét.
szlo=write(fh,&a,sizeof(a));
//------------------------------ számlálás egyenként.
szlo=0; lseek(fh,0,0);
while(!eof(fh)){read(fh,&a,1);szlo++;}
szlo+=sizeof(szlo); lseek(fh,0,0); //Az O_APPEND miatt nem lehet
mozgatni a mutatót írásnál.
write(fh,&szlo,sizeof(szlo));//Csak HOZZÁFüZHETEK!lseek itt nem kell!
close(fh);
//**********************************-----------------------------------------
return 0;
}
(a tell() miatt csak windows alatt futnak!)
Nyissa meg, illetve hozza létre a pelda.txt nevü fájlt az aktuális könyvtárban. Az open visszatérési értékéből állapítsa meg, hogy sikeres volt-e a megnyitás, ezt írja ki a képernyőre.
#include <stdlib.h> // exit() fuggveny miatt
#include <fcntl.h> // open(),close(),write(),read() ... miatt
#include <sys/stat.h> // S_IREAD, S_IWRITE es egyeb modok definialsa talalhato itt
#include <stdio.h> // SEEK_SET es tarsainak definialsa talalhato itt
#include <io.h>
int main(void)
{
int fh;
int a; // olvasott vagy irt karakterek szama
char c;
fh=open("pelda.txt",O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
if(fh==-1) // baj van
{
printf("Nem sikerult a file megnyitasa!\n");
exit(1); // kilepunk a programbol 1 ertekkel jelezzuk h hiba van;
}
printf("Megnyilt a file.");
close(fh);
return 0;
}
Nyissa meg a pelda.txt fájlt. Írja bele, hogy "csoki", majd olvasson ki karaktereket a következő pozíciókról:
#include <stdlib.h> // exit() fuggveny miatt
#include <fcntl.h> // open(),close(),write(),read() ... miatt
#include <sys/stat.h> // S_IREAD, S_IWRITE es egyeb modok definialsa talalhato itt
#include <stdio.h> // SEEK_SET es tarsainak definialsa talalhato itt
#include <io.h>
int main(void)
{
int fh;
int a; // olvasott vagy irt karakterek szama
char c;
fh=open("pelda.txt",O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
if(fh==-1) // baj van
{
printf("Nem sikerult a file megnyitasa!\n");
exit(1); // kilepunk a programbol 1 ertekkel jelezzuk h hiba van;
}
printf("Megnyilt a file.");
a=write(fh,"etcsoki",5);
printf("Ennyit karaktert irtam a fileba: %i\n",a);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
printf("A fajl elejere pozicionalas\n",tell(fh));
lseek(fh,0,SEEK_SET);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
a=read(fh,&c,1);
printf("Ezt olvastam az elejerol: %c\n",c);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
printf("A fajl vege -1-re pozicionalas\n",tell(fh));
lseek(fh,-1,SEEK_END);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
a=read(fh,&c,1);
printf("Ezt olvastam a vegerol: %c\n",c);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
printf("A fajl elejetol +2-re pozicionalas\n",tell(fh));
lseek(fh,2,SEEK_SET);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
a=read(fh,&c,1);
printf("Ezt olvastam az eleje +2 rol: %c\n",c);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
printf("A fajl aktualis +1-re pozicionalas\n",tell(fh));
lseek(fh,1,SEEK_CUR);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
a=read(fh,&c,1);
printf("Ezt olvastam a jelenlegi +2 poziciorol: %c\n",c);
printf("Aktualis fajlpozicio: %i\n",tell(fh));
close(fh);
return 0;
}
Nyissa meg a pelda.txt fájlt. Írja bele 10x, hogy "lali", majd:
pozicionáljon a fájl elejére és irassa ki karakternként a fájl tartalmát a képernyőre azt, hogy a fájl vágáre ért-e azt az eof() függvénnyel vizsgálja
#include <stdlib.h> // exit() fuggveny miatt
#include <fcntl.h> // open(),close(),write(),read() ... miatt
#include <sys/stat.h> // S_IREAD, S_IWRITE es egyeb modok definialsa talalhato itt
#include <stdio.h> // SEEK_SET es tarsainak definialsa talalhato itt
#include <io.h>
int main(void)
{
int fh;
int a,i; // olvasott vagy irt karakterek szama
char c, str[]="lali";
fh=open("pelda.txt",O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
if(fh==-1) // baj van
{
printf("Nem sikerult a file megnyitasa!\n");
exit(1); // kilepunk a programbol 1 ertekkel jelezzuk h hiba van;
}
printf("Megnyilt a file.");
for(i=0;i<10;i++)
{
write(fh,str,sizeof(str)-1); // -1 kell mert nem akarunk sztringzáró karaktert beirni, lehetne hasznalni strlen-t is
}
lseek(fh,0,SEEK_SET); // visszapozicinalok a file elejere
while(1)
{
i=read(fh,&c,1);
if(i<=0) break;
printf("%c",c);
}
close(fh);
return 0;
}
Nyissa meg a pelda.txt fájlt. Írja bele 10x, hogy "lali", majd:
pozicionáljon a fájl elejére és cserélje ki az 'i' betüket 'a' betükre.
#include <stdlib.h> // exit() fuggveny miatt
#include <fcntl.h> // open(),close(),write(),read() ... miatt
#include <sys/stat.h> // S_IREAD, S_IWRITE es egyeb modok definialsa talalhato itt
#include <stdio.h> // SEEK_SET es tarsainak definialsa talalhato itt
#include <io.h>
int main(void)
{
int fh;
int a,i; // olvasott vagy irt karakterek szama
char c, d, str[]="lali";
fh=open("pelda.txt",O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
if(fh==-1) // baj van
{
printf("Nem sikerult a file megnyitasa!\n");
exit(1); // kilepunk a programbol 1 ertekkel jelezzuk h hiba van;
}
printf("Megnyilt a file.");
for(i=0;i<10;i++)
{
write(fh,str,sizeof(str)-1); // -1 kell mert nem akarunk sztringzáró karaktert beirni, lehetne hasznalni strlen-t is
}
lseek(fh,0,SEEK_SET); // visszapozicinalok a file elejere
d='a'; //erre a karakterre cseréljük ki az 'i'-t
while(1)
{
i=read(fh,&c,1);
if(i<=0) break;
if(c=='i')
{
lseek(fh,-1,SEEK_CUR);
write(fh,&d,1); // figyelem: a d változó tartalmazza a csere karaktert
}
}
lseek(fh,0,SEEK_SET); // visszapozicinalok a file elejere
while(1)
{
i=read(fh,&c,1);
if(i<=0) break;
printf("%c",c);
}
close(fh);
return 0;
}