Лекции по обектно-ориентирано програмиране


Текстови файлове. Функции sscanf, sprintf, gets, puts, fgets, fputs



страница6/16
Дата25.07.2016
Размер0.95 Mb.
#6568
ТипЛекции
1   2   3   4   5   6   7   8   9   ...   16

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);

}




Сподели с приятели:
1   2   3   4   5   6   7   8   9   ...   16




©obuch.info 2024
отнасят до администрацията

    Начална страница