Организация потокового ввода вывода. Процедурно-ориентированные средства работы с потоками, страница 3

int fgetc (FILE * stream);

·  чтение строки символов из заданного потока. Чтение символов из потока происходит до тех пор, пока не встретится символ новой строки (‘\n’) или читается не более (n-1) символов. Прочитанная строка записывается в буфер, начиная с ячейки, адресуемой аргументом char* S. К концу строки добавляется символ ‘\0’. В случае oшибки возвращается 0.

char* fgets (char* s, int n,  FILE* stream);

·  запись символа в поток. В случае ошибки возвращается 0.

int fputс ( int c, FILE* stream);

·  запись строки в поток. В случае успеха возвращается длина строки, в случае ошибки EOF.

int fputs (const char* s, FILE* stream);

# include <stdio.h>

# include <stdlib.h>

void Error(const char* message)

{

 printf ( "\n Error:%S\n", message );

 exit (1);

}

void main ( )

{

 FILE *fp; char c; char* filename;

 printf ( "File name?" );

 puts(filename);

 fp = fopen(filename, "r");

 if (!fp) Error ("нельзя открыть файл”);

 while ( (c = fgetc (fp))! = EOF ) putchar(с);

 fclose (fp);

}

Форматированный ввод/ вывод

·  форматированный вывод в поток stdout выполняется функцией printf()

·  форматированный вывод в видеопамять выполняется функцией cprintf(). Эта функция не распознает управляющие коды типа “\n”. Перед вызовом этой функции следует разместить курсор в нужном месте экрана.

·  форматированный вывод в файловый поток выполняется функцией fprintf().

fpintf( fp, “%8.2f”, d);

·  форматированный ввод из файлового потока выполняется функцией fscanf().

/* форматированный ввод из файлового потока в массив символов */

# include <stdio.h>

# include <stdlib.h>

void main( )

{

 FILE* inpf; int i, count; int * array;

 inpf = fopen ("TEST.DAT","r");

 if (! inp f)

 {

  puts ("нельзя открыть TEST.DAT");

  exit(1);

 };

 fscanf (inpf, "%d", &count);       // счетчик значений

 if(count<=0)

 {

  printf("Ошибочное значение %d\n", count); exit(1);

 }

   // создать массив и прочитать значения из файла

 array = new int[count];

 for (i = 0; i <count; i++) fscanf(inpf, "%d", &array[i]);

 fclose (inpf);

 for ( i=0; i < count; i++ )

 printf("array [%2d]==%d\n", i, array[i]);

 delete [ ] array;

}

Двоичные файлы

            Файл рассматривается как последовательность байтов. Существует два основных способа записи и чтения двоичных файлов: последовательный и произвольный.

Файлы с последовательным доступом

·  чтение данных из потока

int fread(void* ptr, int size, int n, FILE* stream);

ptr – указатель на буфер,

size – размер в байтах одного считываемого элемента,

n – количество считываемых элементов.

Файловый указатель располагается непосредственно за последним прочитанным байтом. Эта функция возвращает количество прочитанных элементов или 0 при попытки чтения за концом файла.

·  запись данных в поток

int fwrite (void* ptr, int size, int n, FILE* stream);

# include <stdio.h>

# include <stdlib.h>

void main ( )

{

 FILE * outf; FILE * inpf; int i, value;

 outf = fopen ("INT.DAT", "wb");

 if (!outf) { puts ("ошибка") ; exit (1); }

 for(i=0; i<100; i++) fwrite(&i, sizeof(int), 1, outf);

 fclose(outf);

 inpf = fopen ("INT.DAT",”rb”);

 for(i=0; i<100; i++)

 {

  fread(&value, sizeof(int), 1, inpf);

  printf ("%8d", value);

 }

 fclose (inpf);

}

Файлы с произвольным доступом

·  установить новую позицию указателя файла

int fseek(FILE* stream, long offset, int mode);

Функция возвращает 0 в случае успеха, в случае ошибки – ненулевое значение.

 offset– число байтов, на которое необходимо переместить файловый указатель в направлении, указанном mode.