Файлы. Общая концепция организации ввода-вывода данных в С++. Средства класса ios, обеспечивающие точную настройку вывода, страница 27

char stroka2[SIZE*2];

   strstream iostr (buf, sizeof(buf), ios::in|ios::out); 

iostr << "Minsk  Moskva Vilnus” << ends;   // вывод в поток, указатель записи в конце

iostr.getline(stroka1, sizeof(stroka1), ‘\0’); //ввод из потока в строку, при этом                                 // до работы функции getline указатель чтения находился в начале потока                    //после работы функции getline указатель чтения находится уже внутри потока

cout << stroka1<<endl;                   //вывод на экран содержимого строки

iostr.seekg(0L, ios::beg);     //установка указателя чтения в начало потока

iostr >>stroka2;                      //указатель  чтения после первого слова

cout << stroka2 << endl;                       //Minsk

iostr >>stroka2;                      //указатель  чтения после второго слова

cout<< stroka2 << endl;                       //Moskva

iostr.getline(stroka2, sizeof(stroka2), ‘\0’);    //ввод из потока в строку

cout<< stroka2 << endl;                       //__Vilnus, т.к. getline вводит с пробелами

cout << iostr.str() << endl;          //вывод всего буфера обеспечивает метод str()

return 0;

}

Ввод-вывод в стиле С

  • в программе, которая выполняет операции чтения из файла или запись в файл, должна быть объявлена переменная-указатель на тип FILE (FILE * ifile, *ofile;);

доступ к файлу реализуется с помощью указателя:

FILE *fp;  где FILE – структура, определенная в <stdio.h>, содержащая флаги состояния файла, размер буфера, указатель на буфер и пр.

  • для того чтобы файл был доступен, его надо открыть, указав, для выполнения какого действия открывается файл: чтения, записи или обновления данных, а также тип файла (двоичный или текстовый);

fp=fopen(“путь к файлу”, “тип доступа”); - возвращает указатель на файл или NULL.

  • при работе с файлами возможны ошибки, поэтому рекомендуется при помощи функции ferror проверять результат выполнения потенциально опасных, с точки зрения возникновения ошибок, операций с файлами (fopen);
  • чтение данных из текстового файла можно выполнить при помощи функции fscanf, запись – fprintf;
  • по завершении работы с файлом нужно его обязательно закрыть (функция fclose).
  • При использовании функций fgets() и fputs() операции чтения и записи с текстовыми файлами выполняются построчно.
  • Размер буфера ввода обычно 512 байт (BUFSIZE). Изменить буфер можно: setbuf(), setvbuf();
  • Возможные значения параметра функции fopen:

”r+”

Открытие файла как для чтения, так и для записи. Если файл не существует, то открытия не происходит

”w+”

Создание пустого файла и открытие его как для записи, так и для чтения. Если файл уже существует, то его содержимое стирается.

”r”

Открытие файла только для чтения. Если файл не существует, то открытия не происходит

”w”

Создание пустого файла и открытие его для записи. Если файл уже существует, то его содержимое стирается.

”a”

Открытие файла для добавления информации. Если файл не существует, то он создается.

”a+”

Открытие файла для добавления информации и чтения. Если файл не существует, то он создается, все новые данные добавляются в конец файла.

if ((ifile = fopen (”d:\\x.dat”, ”r+”)) == NULL) printf (……);

if ((ofile = fopen (”d:\\y.dat”, ”w+”)) == NULL) printf (……);

while (( c=fgetc(ifile)) !=EOF) fputc (c, ofile);

Функции fseek позволяет реализовать непосредственный доступ к заданному байту (позиции):

while fseek(fp, offset++, 0) ==0 {putchar (getc(fp));

fp – указатель на файл; offset -  величина смещения,  0 – начальная точка смещения (в данном случае – это начало файла); функция возвращает 0, если ее работа успешно завершена.