Magas szint¶ bemenet, kimenet Programozás II.
Hatwágner F. Miklós Széchenyi István Egyetem, Gy®r
2014. április 29.
Áttekintés
Magas szint¶ bemenet/kimenet (input/output) → absztrakció: fájlok és eszközök (billenty¶zet, képerny®, nyomtató, stb.) rugalmas, hasonló módon történ®, a technikai részletekt®l független kezelése ún. folyamok (stream) segítségével stdio.h → FILE struktúra a folyamok leírására Folyamkezelés f® lépései: 1 2 3
megnyitás (fájl/eszköz folyamhoz kapcsolása → FILE*) m¶veletek (olvasás, írás, pozicionálás) elvégzése lezárás
Hatwágner F. Miklós
Magas szint¶ B/K
Folyamok megnyitása FILE* fopen(const char* azonosito, const char* mod) azonosito -jú fájl megnyitása (lehet teljes elérési út is, de ≤FILENAME_MAX karakter), mod üzemmódban Visszatérés: sikertelen esetben NULL Jelz® r w a r+ w+ a+
Hatás olvasás a folyam elejét®l felülírás (létez® fájl el®zetes törlése), majd írás a folyam elejét®l hozzáf¶zés (írás a folyam végére). Ha a folyam nem létezik, létrehozza. felújítás (update): olvasás és írás a folyam elejét®l létez® fájl törlése, majd megnyitás felújításra a folyam elejét®l olvasás a folyam elejét®l és hozzáf¶zés. Ha a folyam nem létezik, létrehozza.
Hatwágner F. Miklós
Magas szint¶ B/K
Folyamok megnyitása
mod további karakterei: t (text, szöveg) és b (binary, bináris)
Szöveges üzemmód: transzláció Microsoft OS-eken (CR-LF ↔ LF), fájlvég karakter (0x1A) Pl.: "rt+", "r+t" (t és b az 1. karakter után bárhol lehet, alapértelmezés: t) Adatirány váltást (bemenet ↔ kimenet) meg kell el®znie valamilyen pozicionáló fv. hívásának (pl. fseek())
Hatwágner F. Miklós
Magas szint¶ B/K
A FILE struktúra A FILE struktúra egy lehetséges megvalósítása (részlet) typedef struct { short level; unsigned short flags; char fd; unsigned char hold; int bsize; unsigned char *buffer; unsigned char *curp; /* ... */ } FILE;
/* /* /* /* /* /* /*
puffer telítettség */ állapotjelz®k */ fájlleíró */ ungetc() kar., ha nincs puffer */ puffer mérete */ puffer címe */ akt. pozíció a pufferben */
Fájl végének tesztelése: #define feof(f) ((f)->flags & _F_EOF) #define _F_EOF 0x0020
Fájlvég jelz®t állítják: bemeneti és pozicionáló m¶veletek, clearerr() hívás Hatwágner F. Miklós
Magas szint¶ B/K
Alapvet® karakteres B/K m¶veletek, folyam lezárása Egy karakter olvasása int fgetc(FILE* folyam)
Visszatérés: a folyam következ® unsigned char karaktere el®jel kiterjesztés nélkül int-re konvertálva. Hiba esetén és fájl végén: EOF Mellékhatás: fájlpozíció eggyel el®bbre állítása Egy karakter írása int fputc(int c, FILE* folyam) c -t írja a folyam -ba, unsigned char-rá alakítva Visszatérés: általában c, hiba esetén EOF
Folyam lezárása int fclose(FILE* folyam)
Az automatikusan allokált puereket üríti Visszatérés: általában 0, hiba esetén EOF Hatwágner F. Miklós
Magas szint¶ B/K
Példa: állomány másolása #include <stdio.h> int main(int argc, char* argv[]) { FILE *be, *ki; int c; printf("Parancssorban adott fájl másolása\n"); if(argc!=3) { printf("Használat: %s bemenet kimenet\n", *argv); return 1; } if((be=fopen(*(argv+1), "rb"))) { if((ki=fopen(*(argv+2), "wb"))) { while((c=fgetc(be)) != EOF) { if(fputc(c, ki) == EOF) { printf("B/K hiba\n"); break; } } fclose(be); fclose(ki); } else { printf("%s megnyitása sikertelen.\n", *(argv+2)); fclose(be); return 3; } } else { printf("%s megnyitása sikertelen.\n", *(argv+1)); return 2; } return 0; } Hatwágner F. Miklós
Magas szint¶ B/K
Puerezés Háromféle megvalósítás: teljes puerezettség (_IOFBF): puer teljes feltöltése csak kiürülés esetén, ill. puer teljes ürítése csak betelés után, egyszerre történik meg. Pl. általános fájlok, memóriafoglalás: malloc()
sorpuerezés (_IOLBF): újsor karakterig töltik, ill. ennek érkezésekor ürítik a puert, pl. stdin puerezetlenség (_IONBF): minden m¶velet eredménye azonnal a fájlba kerül (de az OS gyorstárazhat (cache)!), pl. stdout, stderr
buffer
curp level bsize
Hatwágner F. Miklós
Magas szint¶ B/K
Puerezés int setvbuf(FILE* folyam, char* puff, int tipus, size_t meret) void setbuf(FILE* folyam, char* puff) folyam : amelyik folyam puerezését módosítani kívánjuk puff : az új puer címe tipus : _IOFBF, _IOLBF, _IONBF meret : új puer mérete
Közvetlenül a megnyitás után kell használni a fv.-eket! A folyam lezárásakor a puer létezzen és legyen elérhet®! Hibás puerezés! #include <stdio.h> int main(void) { char buf[BUFSIZ]; setbuf(stdin, buf); printf("Hello, world!\n"); return 0; }
Hatwágner F. Miklós
Magas szint¶ B/K
Puerezés setbuf() sajátosságai: puff == NULL → puerezetlen folyam A puernek BUFSIZ méret¶nek kell lennie
setvbuf() sajátosságai: Puerezetlenség a tipus -sal állítható; puff == NULL → setvbuf() foglal memóriát malloc() hívással Visszatérés: sikeres esetben 0. Beállítja a globális errno-t
setbuf(folyam, puff); ≡ setvbuf(folyam, puff, puff ? _IOFBF : _IONBF, BUFSIZ);
Hatwágner F. Miklós
Magas szint¶ B/K
Puerezés Puer kényszerített ürítése int fflush(FILE* folyam)
Kimenet: puer írása a fájlba, bemenet: deniálatlan, többnyire törli a puert Felhasználható: pl. adatirány (B ↔ K) váltáskor, fflush(NULL) → összes kimeneti folyam ürítése Folyam nyitva marad Puerezetlen folyam → hatástalan Visszatérés: sikeres esetben 0, különben EOF (és errno értéket kap)
Hatwágner F. Miklós
Magas szint¶ B/K
Pozicionálás Lehetséges pozíció (fájlmutató): [0, fájlméret-1] (bármely bájt elérhet®) Lemezes fájlok: közvetlen elérés, eszközök: csak soros elérés int fseek(FILE* folyam, long eltolas, int honnan) folyam : amiben pozicionálni kívánunk eltolas : hány bájtnyival mozdítsuk el a fájlpozíciót honnan : honnan kezdve, mérve kell eltolas -nyival
módosítani
SEEK_SET: fájl kezdetét®l SEEK_CUR: aktuális pozíciótól SEEK_END: fájl végét®l
hatástalanítja az utolsó ungetc() hívást felújításra nyitott fájlban olvasás, írás egyaránt következhet törli a fájlvég jelz®t Visszatérés: sikeres esetben 0, különben −1 és errno-t beállítja Hatwágner F. Miklós
Magas szint¶ B/K
Pozicionálás long ftell(FILE* folyam)
Visszatérés: a fájlmutató értéke (fájl elejét®l mérve), vagy −1L hiba esetén Fájlméret lekérdezése #include <stdio.h> long fajlmeret(FILE *folyam) { long aktpoz, hossz; aktpoz = ftell(folyam); fseek(folyam, 0L, SEEK_END); hossz = ftell(folyam); fseek(folyam, aktpoz, SEEK_SET); return(hossz); }
Hatwágner F. Miklós
Magas szint¶ B/K
Pozicionálás void rewind(FILE* folyam)
Ugrás a folyam elejére ≈ (void) fseek(folyam, 0L, SEEK_SET), de a hibajelz®
bitet is törli
FILE struktúra flags tagjának bitjeinek jelentése pl. #define _F_READ 0x0001 → csak olvasható fájl #define _F_WRIT 0x0002 → csak írható fájl #define _F_RDWR 0x0003 → olvasható és írható fájl #define _F_BUF 0x0004 → malloc() puerelt #define _F_LBUF 0x0008 → sorpuerelt #define _F_ERR 0x0010 → hibajelz® #define _F_EOF 0x0020 → fájlvég jelz® #define _F_BIN 0x0040 → bináris fájl jelz® Hatwágner F. Miklós
Magas szint¶ B/K
Pozicionálás
Probléma: fseek() és ftell() long típussal dolgozik → fpos_t int fgetpos(FILE* folyam, fpos_t* eltolas); int fsetpos(FILE* folyam, fpos_t* eltolas); honnan : SEEK_SET Visszatérés: sikeres esetben 0, különben −1 és beállítják errno-t fsetpos(): törli az ungetc()-vel visszarakott karaktert,
fájlvég jelz®t
Hatwágner F. Miklós
Magas szint¶ B/K
Bemeneti m¶veletek int fgetc(FILE* folyam) int getc(FILE* folyam) getc(): fgetc() megvalósítása platformfügg® módon, ált. makróval Mellékhatások!
getchar() makró lehetséges deníciója #define getchar() getc(stdin) int ungetc(int c, FILE* folyam) Visszateszi a folyam -ba c -t (kivéve EOF, int → unsigned char) Csak egy karakter visszatétele garantált (ld. FILE struktúra hold tagja), puerezés hiányában is; legközelebb ezt fogja olvasni Törlik a visszatett karaktert: fflush(), fseek(), fsetpos(), rewind(). Visszatérés: c értéke, hiba esetén EOF. Hatwágner F. Miklós
Magas szint¶ B/K
Bemeneti m¶veletek char* fgets(char* s, int n, FILE* folyam) Legfeljebb n−1 jelb®l álló karakterlánc olvasása folyam -ból sorvégig
'\n'-et és '\0'-t is tárolja s -ben Visszatérés: s értéke, fájl végén vagy hiba esetén NULL
getline() eltér fgets()-t®l: a beolvasott jelek számát adja vissza mindig az stdin folyamból olvas → eggyel kevesebb paraméter legfeljebb n jelet olvas, vagy '\n'/EOF-ig, de '\n'-t nem tárolja char* gets(char* s) stdin-r®l olvas, túlcsordulás (buer overrun) veszélye size_t fread(void* mut, size_t meret, size_t n, FILE* folyam) n darab meret méret¶ adategység olvasása folyam -ból, majd tárolása mut címt®l Visszatérés: olvasott adategységek száma (≤n ) Hatwágner F. Miklós
Magas szint¶ B/K
Bemeneti m¶veletek int scanf(const char* formatum, ...) int fscanf(FILE* folyam, const char* formatum, ...) scanf() stdin-r®l olvas Visszatérés: sikeresen vizsgált→konvertált→tárolt mez®k száma, hiba vagy fájlvég esetén EOF formatum tartalmazhat:
fehér karaktereket olvassa tetsz®leges mennyiségben, de nem tárolja ®ket nem fehér karaktereket olvassa, de nem tárolja, viszont elvárja a formatum -ban lév®vel egyezést formátumspecikációkat vezérlik az olvasást és a konverziót. Tárolás a megadott címeken. Ált. alak: % <*> <szélesség>
típuskarakter Hatwágner F. Miklós
Magas szint¶ B/K
Bemeneti m¶veletek Formátumspecikációk * → olvas/ellen®riz/konvertál, de nem tárol! szélesség → legfeljebb ennyi karaktert olvas (megáll a fehér és a konvertálhatatlan karaktereknél) típusmódosítók: h: int → short int l: int → long int, float → double L: float → long double Típuskarakter d i o u x e, E f g, G
Elvárt bemenet
Paraméter típusa
decimális egész decimális, oktális, vagy hexadecimális egész oktális egész el®jel nélküli decimális egész hexadecimális egész lebeg®pontos valós lebeg®pontos valós lebeg®pontos valós
int* int* int* unsigned int* int* float* float* float*
Elvárt lebeg®pontos formátum:
<+|-> ddddddddd <.> dddd <E|e> <+|-> ddd
Hatwágner F. Miklós
Magas szint¶ B/K
Bemeneti m¶veletek
Típuskarakter n
Elvárt bemenet nincs
p c
megvalósítástól függ®, ált. hexadecimális alak karakter
%
% karakter
s [keres®készlet] [^keres®készlet]
karakterlánc karakterlánc karakterlánc
Hatwágner F. Miklós
Paraméter típusa int* Az eddig sikeresen olvasott karakterek számát tárolja. void*
char*, ha mez®szélességet is
megadtak nincs konverzió, a % karaktert jelzi char* char* char*
Magas szint¶ B/K
CSV fájl olvasása
tabla.csv
tartalma
1;Jani;";";2014.04.08;1 Ft 2;Anna;"Ez itt egy ""idezet"".";2014.04.09;2 Ft 3;Petra;,;2014.04.10;3 Ft Forráskód (1/3)
#include <stdio.h> #define ELVALASZTO ';' #define SZOVEGHAT '"' #define MAX 1024 char* kovMezo(char*); int main(int argc, char* argv[]) { FILE *csv; char sor[MAX]; char *mezo; printf("Parancssorban adott CSV fájl tartalmának kijelzése\n\n"); ...
Hatwágner F. Miklós
Magas szint¶ B/K
CSV fájl olvasása Forráskód (2/3)
... if(argc!=2) { printf("Használat: %s fájlnév\n", *argv); return 1; } if((csv=fopen(*(argv+1), "rt"))) { while(fgets(sor, MAX, csv)) { mezo=kovMezo(sor); while(mezo) { printf("%s\n", mezo); mezo=kovMezo(NULL); } } fclose(csv); } else { printf("%s megnyitása sikertelen.\n", *(argv+1)); return 2; } return 0; } Hatwágner F. Miklós
Magas szint¶ B/K
CSV fájl olvasása Forráskód (3/3)
char* kovMezo(char* sor) { static char* mm = NULL; char *eleje, *vege; char idezet = 0; if(sor) mm = sor; else if(!mm) return NULL; eleje = vege = mm; while(*mm && (*mm!=ELVALASZTO || idezet)) { if(*mm == SZOVEGHAT) if(!idezet) idezet = 1; else if(*(mm+1) == SZOVEGHAT) *vege++ = *mm++; else idezet = 0; else *vege++ = *mm; mm++; } if(*mm) mm++; else mm=NULL; *vege = '\0'; return eleje; } Hatwágner F. Miklós
Magas szint¶ B/K
Kimeneti m¶veletek int fputc(int c, FILE* folyam) int putc(int c, FILE* folyam) putc(): fputc() megvalósítása platformfügg® módon, ált. makróval Mellékhatások!
putchar() makró lehetséges deníciója #define putchar(c) putc((c), stdout) int fputs(const char* s, FILE* folyam) s karakterláncot írja folyam -ba Nem f¶z hozzá '\n'-t, és a '\0'-t sem írja ki Visszatérés: sikeres esetben ≥ 0, egyébként EOF
int puts(const char* s) mint fputs(), de az stdout folyamra ír Hatwágner F. Miklós
Magas szint¶ B/K
Kimeneti m¶veletek size_t fwrite(const void* mut, size_t meret, size_t n, FILE* folyam) mut címt®l kezdve elhelyezett n darab meret méret¶ adategység írása a folyam -ba Visszatérés: sikeresen kiírt adategységek száma (≤n )
int printf(const char* formatum, ...) int fprintf(FILE* folyam, const char* formatum, ...) printf() stdout-ra ír Visszatérés: sikeres esetben a folyamba írt karakterek száma, egyébként negatív érték
formatum tartalmazhat: nyomtatandó karaktereket változatlanul írja ®ket a folyamba formátumspecikációkat vezérlik a konverziót és az írást Hatwágner F. Miklós
Magas szint¶ B/K
Kimeneti m¶veletek Formátumspecikáció Ált. alak: % <jelz®k> <szélesség> <.pontosság> típuskarakter
Típuskarakter d i o u x
Elvárt paraméter
X f e E g
int double double double double
G
double
int int int int int
Kimenet formája el®jeles decimális egész el®jeles decimális egész el®jel nélküli oktális egész vezet® 0 nélkül el®jel nélküli decimális egész el®jel nélküli hexadecimális egész (kisbet¶s alak, vezet® 0x nélkül) ugyanaz, de nagybet¶s alakban <−>dddd.dddd alakú el®jeles érték <−>d.ddd. . . e<+|−>ddd alakú el®jeles érték <−>d.ddd. . . E<+|−>ddd alakú el®jeles érték értékt®l/pontosságtól függ®en e vagy f alakú el®jeles érték ua., mint g, de az exponens részben E áll
Hatwágner F. Miklós
Magas szint¶ B/K
Kimeneti m¶veletek Típuskarakter % c s
Elvárt paraméter nincs
n
int*
p
void*
Jelz® −
+
'' #
int char*
Kimenet formája a % karakter jelenik meg egyetlen karakter karakterlánc megjelenik a '\0' kivételével. Ha pontosságot is megadtak, akkor legfeljebb ennyi karaktert ír ki a paraméterként adott címre írja az eddig kiírt karakterek számát ált. hexadecimális formában megjeleníti a mutató értékét)
Hatás igazítás balra, párnázás jobbról. Ennek hiányában fordított m¶ködés kikényszeríti az el®jel megjelenítését. Ha szóköz jelz®t is megadtak, azt gyelmen kívül hagyja nemnegatív számok elé szóközt ír alternatív megjelenítés kikényszerítése
Hatwágner F. Miklós
Magas szint¶ B/K
Kimeneti m¶veletek Típuskarakter c, s, d, i, u e, E, f g, G o x, X
Alternatív megjelenítés u. a. akkor is megjelenik a tizedes pont, ha nem követi számjegy u. a., mint e és E, de az eredmény követ® 0-it nem vágja le nem zérus érték elé 0-t ír nem zérus érték elé 0x-et/0X-et ír
szélesség a minimális mez®szélességet adja meg. Alakjai:
a formátumspecikációba beleírva. Rövidebb adatot párnázó karakterekkel kiegészíti. Ha a 0 karakterrel kezd®dik, akkor balról 0-val párnáz * → a köv. int típusú paraméter adja meg a min. mez®szélességet pontosság formája .-ot követ® egész: a minimálisan megjelenítend® karakterek számát adja meg d, i, o, u, x, X típuskarakterek használatakor, a törtrész karaktereinek számát e, E, f esetén. g és G esetén a megjelenített szignikáns jegyek számát korlátozza. s típuskarakter: megjelenítend® karakterek számát korlátozza. Az egész-et elhagyva vagy negatív érték esetén nullát feltételez. * → a következ® int típusú paraméter határozza meg a pontosságot Hatwágner F. Miklós
Magas szint¶ B/K
CSV fájl írása Forráskód (1/3)
#include <stdio.h> #define ELVALASZTO ';' #define SZOVEGHAT '"' #define FNEV "kimenet.csv" #define MAX 1024 char* atalakit(char* mit) { char *f, *c, *uj; int hossz, elvdb, szhdb; for(elvdb=szhdb=0, f=mit; *f; f++) { if(*f == ELVALASZTO) elvdb++; else if(*f == SZOVEGHAT) szhdb++; } if(*--f == '\n') *f = '\0'; else f++; hossz = f-mit; if(elvdb || szhdb) hossz+=2; hossz+=szhdb; ... Hatwágner F. Miklós
Magas szint¶ B/K
CSV fájl írása Forráskód (2/3) ... if((uj=(char*)malloc(hossz+1))) { c = uj; f = mit; if(elvdb || szhdb) *c++ = SZOVEGHAT; while(*f) { if(*f == SZOVEGHAT) *c++ = *f; *c++ = *f++; } if(elvdb || szhdb) *c++ = SZOVEGHAT; *c = '\0'; } return uj; } int main(void) { FILE *csv; char *mezo; char puff[MAX]; int sor, oszlop, maxo; ... Hatwágner F. Miklós
Magas szint¶ B/K
CSV fájl írása Forráskód (3/3)
... if(!(csv=fopen(FNEV, "wt"))) { fprintf(stderr, "Nem lehet létrehozni %s-t.\n", FNEV); return 1; } printf("Adatok írása a %s fájlba üres sorig.\n", FNEV); sor = oszlop = 1; while(printf("%d. sor, %d. oszlop adata: ", sor, oszlop), fgets(puff, MAX, stdin)) if(*puff == '\n') { if(oszlop==1) break; if(sor==1) { maxo = oszlop-1; sor++; oszlop = 1; fputc('\n', csv); } } else { if(oszlop>1) fputc(ELVALASZTO, csv); fprintf(csv, "%s", mezo=atalakit(puff)); free(mezo); if(sor>1 && oszlop==maxo) { sor++; oszlop = 0; fputc('\n', csv); } oszlop++; } fclose(csv); return 0; } Hatwágner F. Miklós
Magas szint¶ B/K
Szavazás Forráskód (1/2)
#include <stdio.h> #define MAX 'e' #define FNEV "szavazat.dat" int main(void) { FILE *szav; long tomb[MAX-'a'+1] = {0}; int c; printf("Szavazatok számlálása\n"); if((szav=fopen(FNEV, "r+b"))) { if(fread(tomb, sizeof(tomb), 1, szav)) { printf("Mentett adatok beolvasva.\n"); rewind(szav); } } else if(!(szav=fopen(FNEV, "wb"))) { fprintf(stderr, "%s nem hozható létre.\n", FNEV); return 1; } ... Hatwágner F. Miklós
Magas szint¶ B/K
Szavazás Forráskód (2/2) ... while(printf("Az Ön szavazata [a-%c]:", MAX), (c=getchar())!='\n') { if(c>='a' && c<=MAX && getchar()=='\n') tomb[c-'a']++; else { printf("Hibás szavazat\n"); while(getchar()!='\n'); } } printf("A szavazás állása:\n"); for(c=0; c<=MAX-'a'; c++) printf("%c: %ld\n", 'a'+c, tomb[c]); if(!fwrite(tomb, sizeof(tomb), 1, szav)) { fprintf(stderr, "Az adatok mentése meghiúsult.\n"); fclose(szav); return 2; } fclose(szav); return 0; } Hatwágner F. Miklós
Magas szint¶ B/K
Hibakezelés Hibák jelzése: visszatérési értékkel (pl. EOF, NULL), errno beállításával Hibakódok → errno.h, szimbolikus állandók, pl. scanf() esetén:
EBADF a folyam fájl leírója hibás, vagy a folyam nincs megnyitva olvasásra EINTR az olvasást jelzés szakította meg EINVAL nincs elég paraméter, vagy a formatum paraméter értéke NULL Hibaüzenetek és azokat kezel® fv.-ek → string.h
char* strerror(int hibakod) hibaüzenetet szolgáltatja void perror(const char* s) stderr-re írja s értékét, egy :-ot, majd az errno-tól függ® hibaüzenetet
Hatwágner F. Miklós
Magas szint¶ B/K
Hibakezelés void clearerr(FILE* folyam) Törli folyam fájlvég és hibajelz® bitjét (erre a rewind() is
képes). A hibajelz® törléséig minden m¶velet hibával tér vissza! A fájlvég jelz® bitet törlik: clearerr()
bemeneti és pozicionáló m¶veletek A hibajelz® bit értékét visszaadó makró lehetséges megvalósítása #define ferror(f) ((f)->flags & _F_ERR)
Hatwágner F. Miklós
Magas szint¶ B/K
Egyéb függvények FILE* freopen(const char* azonosito, const char* mod, FILE* folyam) átirányítás: a folyam forrása/célja ezentúl azonosito (jellemz® alkalmazás: szabványos folyamok, pl. stdin
átirányítása) Ha egyszer a szabvány bemenetet átirányítottuk, azt nem lehet többé visszaállítani!
stdlib.h → int system(const char* parancs) parancs végrehajtatása az OS parancsértelmez®jével (shell). Ha parancs==NULL, nulla visszatéréssel jelzi, ha a
parancsértelmez® elérhetetlen. Visszatérés: fejleszt®környezett®l függ, de pl. a futtatott prg. kilépési kódja lehet, vagy −1 hiba esetén.
int remove(const char* fajlnev) fajlnev nev¶ fájl törlése. Csak lezárt folyamra használjuk! Visszatérés: sikeres esetben 0, egyébként −1. Hatwágner F. Miklós
Magas szint¶ B/K
Egyéb függvények int rename(const char* reginev, const char* ujnev) Fájl átnevezése, könyvtárak közötti mozgatása. Csak lezárt folyamra használjuk! Visszatérés: sikeres esetben 0, egyébként −1, és beállítja errno-t.
FILE* tmpfile(void) Ideiglenes fájl létrehozása "wb+" módban. A folyam lezárásakor/programból kilépéskor automatikus törlés. Visszatérés: a FILE struktúrát címz® mutató, hiba esetén NULL.
char* tmpnam(char s[L_tmpnam]) Egyedi fájlazonosító el®állítása, majd tárolása statikus puerben. Visszatérés: a puer címe. Ha s!=NULL, akkor a megadott címen lév®, legalább L_tmpnam méret¶ helyre is bemásolja az azonosítót Legalább TMP_MAX különböz® azonosító el®állítása garantált. Hatwágner F. Miklós
Magas szint¶ B/K