10. Текстови файлове. Функции sscanf, sprintf, gets, puts, fgets, fputs.
функция sscanf;
прототип: int sscanf (const char *ss, const char *format, …);
функцията sscanf има еквивалентно изпълнение на scanf, но чете от низ, записан в оперативната памет; използва се за преобразуване на низ от символи към числови стойности; нулевият байт в края на низа, сочен от ss се интерпретира като EOF;
функция sprintf;
прототип: int sprintf (char *ss, const char *format, …);
функцията sprintf има еквивалентно изпълнение на printf, но записва в низ в оперативната памет; използва се за преобразуване на числови стойности към символен низ; в края на този низ автоматично се добавя нулев байт;
функция gets;
прототип: char *gets (char *str);
тази функция се използва за прочитане на цял ред от stdin; тя преобразува символа за край на ред ‘\n’ в нулев байт; прочетеният ред ще се прехвърли в низа, сочен от указателя str; резултатът е указателят към прехвърления низ или NULL при грешка или прочитане на EOF;
функция puts;
прототип: int puts (const char *str);
тази функция извежда на stdout низа, който се сочи от str; puts преобразува символа за край на низ (‘\0’) в символ за нов ред (‘\n’); при успешно изпълнени puts връща неотрицателно цяло число, при грешка връща EOF;
функция fgets;
прототип: char *fgets (char *str, int n, FILE *fp);
функцията чете низ от входния поток (сочен от fp) и го прехвърля в низа, сочен от указателя str; функцията спира въвеждане след прочитане на символа за нов ред, който се съхранява, или след прочитане на n-1 символа или след прочитане на EOF; и в трите случая функцията автоматично добавя нулев байт; при успешно изпълнение, функцията връща указател към прочетения низ, при достигане на EOF или при грешка по време на изпълнение, fgets връща NULL;
функция fputs;
прототип: int fputs (const char *str, FILE *fp);
функцията fputs извежда във файл, сочен от fp, низът сочен от str; за разлика от puts, тя не добавя символ за нов ред към извеждания низ; функцията връща като резултат неотрицателно цяло число при успешно изпълнение или EOF при грешка;
примерна програма:
#include
#include //функция exit
#define MAX 81
void main ()
{ char name[MAX], address[MAX], ch;
int age; FILE *fp;
fp = fopen (“my.txt”, “w”);
if (fp==NULL)
{ printf (“Файлът не може да бъде отворен!\n”);
exit (1);
}
printf (“Въведете данни или Ctrl+Z за край\n”);
printf (“Име: “);
while ( fgets (name, MAX-1, stdin) != NULL)
{ fputs (name, fp);
printf (“Адрес: “);
fgets (address, MAX-1, stdin);
fputs (address, fp);
printf (“Възраст: “);
scanf (“%d”, &age);
fflush (stdin); //ще четем низ след това
fprintf (fp, “%d”, age);
fputc (“\n”, fp); fputc (“\n”, fp);
printf (“\nИме: “);
}
fclose (fp);
fp = fopen (“my.txt”, “r”);
if (fp==NULL)
{ printf (“Файлът не може да бъде отворен!\n”);
exit (1);
}
printf (“Съдържание на файла: \n“);
while ( fgets (name, MAX-1, fp) != NULL)
{ fputs (name, stdout);
fgets (address, MAX-1, fp);
fputs (address, stdout);
fscanf (fp, “%d”, &age);
printf (“%d”, age);
ch = fgetc (fp); putchar (ch);
ch = fgetc (fp); putchar (ch);
}
fclose (fp);
}
11. Двоични файлове. Функции ftell, fseek, rewind, fflush, fread, fwrite.
функция ftell;
прототип: long ftell (FILE *fp);
функцията връща текущата позиция за достъп до данните във файла, сочен от fp; в структурата FILE има поле в което се съхранява тази текуща позиция; тя има стойност 0, когато указателят към текущата позиция сочи към началото на файла; резултатът от функцията при успешно изпълнение е текущата позиция във файла, при грешка функцията връща –1;
функция fseek;
прототип: int fseek (FILE *fp, long offset, int whence);
с тази функция се задава нова текуща позиция за достъп до данните във файла, сочен от fp; за целта се задава offset – адресно отместване в брой байтове и whence – типа на адресното отместване; той може да бъде:
-
спрямо началото на файла – тип 0, може да се задава и чрез макрос SEEK_SET;
-
спрямо текущата позиция – тип 1, може да се задава и чрез макрос SEEK_CUR;
-
спрямо края на файла – тип 2, може да се задава и чрез макрос SEEK_END;
функцията връща 0 при успешно изпълнение и цяло число различно от 0 при грешка;
функция rewind;
прототип: void rewind (FILE *fp);
тази функция позиционира текущата позиция във файла, сочен от fp, в началото на файла; изпълнението на rewind е еквивалентно на
fseek (fp, 0L, SEEK_SET) с тази разлика, че rewind изчиства в структурата FILE индикаторите за край на файл и за грешка, докато fseek изчиства само индикаторът за край на файл;
функция fflush;
прототип: int fflush (FILE *fp);
тази функция изчиства буферите на файла, сочен от fp; ако буферите са свързани с изходен файл или с файл за актуализация, то съдържанието им се извежда в този файл;
функция връща 0 при успешно изпълнение и EOF при грешка;
функция fread – функция за въвеждане без преобразуване;
прототип: size_t fread ( void *ptr, size_t size, size_t n, FILE *fp);
функцията чете от файла, сочен от fp, указаният брой блокове от данни и записва полученото в област от оперативната памет, която се сочи от указателя ptr; обикновено ptr е указател към структура; size е размер на един блок в брой байтове, n е броят на блоковете за прочитане; общият брой байтове за четене е n*size; при успешно изпълнение функцията връща броя на действително прочетените блокове (n), при грешка или достигане до края на файла връща 0 или цяло число < n;
функция fwrite – функция за извеждане без преобразуване;
прототип: size_t fwrite ( void *ptr, size_t size, size_t n, FILE *fp);
функцията извежда във файла, сочен от fp, указаният брой блокове от данни; ptr е указател към областта от оперативната памет, където са записани данните; обикновено ptr е указател към структура; size е размер на един блок в брой байтове, n е броят на блоковете за извеждане; общият брой байтове за извеждане е n*size; при успешно изпълнение функцията връща броя на действително изведените блокове (n), при грешка или достигане до края на файла връща 0 или цяло число < n;
Важно: функциите ftell, fseek се отнасят за двоични файлове; при текстови файлове има ограничения (поради преобразуването) – например за функцията fseek аргументът offset трябва да е 0 или стойност, която функцията ftell е върнала при предишно извикване за същия файл, също така аргументът whence трябва да има стойност SEEK_SET (0);
Примерна програма: създава двоичен файл с компоненти структури от данни за студенти – име, група, среден успех; извежда студентът с най-голям среден успех;
#include
#include //функция exit
#include //функция getche
#include //функция toupper
struct student
{ char name[60];
int group;
float av_score;
} ;
int writefile (char *);
void readfile (char *);
void main ()
{ int i; char name_file[30];
printf (“Име на файл: “);
gets (name_file);
i = writefile (name_file);
if (i!=EOF)
printf (“Файлът е създаден!\n”);
else {
printf (“Файлът не е създаден.\n”);
exit (1);
}
readfile (name_file);
}
int writefile (char *name_file)
{ FILE *fp;
struct student s;
if ( (fp = fopen (name_file, “wb”) ) == NULL)
{ printf (“Файл с име %s не може да се създаде\n”, name_file);
exit (1);
}
do {
printf (“Име: “); gets (s.name);
printf (“Група: “); scanf (“%d”, &s.group);
printf (“Среден успех: “); scanf (“%f”, &s.av_score);
fflush (stdin);
fwrite (&s, sizeof (s), 1, fp);
printf (“Ще въвеждате ли още? (Y/N): “);
} while ( toupper (getche ()) == ‘Y’ );
return fclose (fp);
}
void readfile (char *name_file)
{ FILE *fp;
struct student s;
int flag = 0;
long int pos;
float max_av;
if ( (fp = fopen (name_file, “rb”)) == NULL )
{ printf (“Файлът не може да бъде отворен!\n”);
exit (1);
}
while ( fread (&s, sizeof (s), 1, fp) == 1)
{ if (!flag)
{ max_av = s.av_score; pos = 0; flag = 1; }
else if (s.av_score > max_av)
{ max_av = s.av_score;
pos = ftell (fp) – sizeof (s);
}
}
fseek (fp, pos, SEEK_SET);
fread (&s, sizeof (s), 1, fp);
printf (“%s %d %.2f\n”, s.name, s.group, s.av_score);
fclose (fp);
}
Сподели с приятели: |