Základy algoritmizácie a programovania
Ing. Daniel Hládek PhD.
https://en.wikipedia.org/wiki/Hard_disk_drive
--
Solid State Drive
Oblasť v súborovom systéme, ktorá sa skladá zo súvislých blokov.
Pomocou funkcie fopen:
Návratová hodnota je smerník FILE*, ktorý predstavuje čítaciu hlavu.
rwa
čítanie, zápis, pridávanie
r Čítanie zo súboru:
w Zápis do súboru
a Pridávanie do súboru
http://www.cplusplus.com/reference/cstdio/fopen/
fopen vráti hodnotu NULL. #include <stdio.h>
int main ()
{
FILE * pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fclose (pFile);
}
return 0;
}
Tento príklad nám vytvorí prázdny súbor. Zmaže starý súbor.
http://www.cplusplus.com/reference/cstdio/fopen/
Načítame zo súboru riadok, veľký max. 99 znakov.
Čo môže zlyhať:
Argumenty fgets:
Návratová hodnota:
fgets číta aj koniec riadka \n.
#include <stdio.h>
int main() {
FILE * pFile;
char mystring[100];
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL){
perror("Error opening file");
}
else {
if ( fgets (mystring , 100 , pFile) != NULL ) {
printf("%s",mystring);
}
fclose (pFile);
}
return 0;
}
zo štandardného vstupu
#include <stdio.h>
#define SIZE
int main(){
char buffer[SZIE];
memset(buffer,0,SIZE);
pFile = fopen ("myfile.txt" , "r");
if (pFile == NULL){
perror("Error opening file");
return 1;
}
while (fgets( buffer, SIZE, pFile) != NULL){
printf("%s",buffer);
}
fclose (pFile);
return 0;
}
Štandardný vstup je tiež súbor, ktorého smerník máme k dispozícii ako globálnu premennú stdin.
#include <stdio.h>
int main(){
char mystring[100];
memset(0,mystring,100);
if ( fgets (mystring , 100 , stdin) != NULL )
printf("%s",mystring);
}
return 0;
}
#include <stdio.h>
int main(){
char buffer [1024];
while (fgets( buffer, 1024, stdin) != NULL){
printf("%s",buffer);
}
return 0;
}
Program očakáva, že text bude vo formáte jedno číslo na jeden riadok, napr:
2
4
78
Možné chyby - zadaný text nemusí byť v požadovanom formáte.
čítanie textu a konverzia na číslo
fgets.sscanf.#include <stdio.h>
int main(){
char buffer [1024];
while (fgets( buffer, 1024, stdin) != NULL){
int number = 0;
int res = sscanf("%d",&number);
if (res != 1){
perror("Input file format");
return 1;
}
printf("%d",number);
}
return 0;
}
fopen nastavme na:
w Vynulovanie súboru (vložím novú pásku a nastavím ju na začiatok)a Pripojenie do existujúceho súboru - appendpodobný ako výpis na obrazovku pomocou funkcie fprintf.
príklad s fprintf
#include <stdio.h>
void copy(FILE* inf,FILE* outf);
int main(int argc, char** argv){
if (args != 3){
perror("Správne použitie: cp <fromfile> <tofile>\n");
return 1;
}
FILE* inf = fopen(argv[1],"r");
if (inf == NULL){
printf("Súbor %s sa nepodarilo otvoriť alebo neexistuje",argv[1];
return 1;
}
FILE* outf = fopen(argv[2],"w");
if (outf == NULL){
printf("Súbor %s neexistuje alebo nie je zapisovateľný",argv[1];
return 1;
}
copy(inf,outf);
fclose(inf);
fclose(outf);
}
void copy(FILE* inf,FILE* outf){
char buffer [1024];
while (fgets( buffer, 1024, inf) != NULL){
fprintf(outf,"%s",buffer);
}
}
Funguje takýto program na všetky súbory?
Reťazec nie je pole znakov, lebo nemôže osahovať nulu v strede.
Pre prácu s ľubovoľnými dátami musíme využiť iné metódy:
void copy_binary(FILE* inf,FILE* outf){
char buffer [1024];
int count =- 0;
// Ak funkcia fread vráti nulu, čítanie sa skončilo
while((count = fread(buffer, sizeof(int), 1024, inf)) > 0){
fwrite(buffer, sizeof(int), count, outf);
counter++;
}
}