Главная Обратная связь

Дисциплины:






Using namespace std;



char* Rus_simv(char st);
char *Rus_simv(char* st)
{
unsigned char* p = st;
while ( *p)
{
if (*p >= 192)
if (*p <= 239)
*p -=64;
else
*p -=16;
p++;
}
return st;
}

void time() // Наша функция, отчетная за вывод времяни:
{
textcolor(RED) ; //Определяем цвет текста
textbackground(WHITE); //Определяем фон теста
time_t system_time; //Объявляем время
system_time = time(NULL);

cprintf(Rus_simv("Местное время: "));
cprintf(ctime(&system_time)); //выводим время
}

void main()
{
time();
cout << (Rus_simv("\n\nДля завершения программы щелкни на клавишу")) ;
getch();
}

Далее мы поговорим о работе с текстовыми файами и выводом их содержимового на экран.

void file() //Наша функция открывающая файл
{
FILE *file; //Объявляем переменную типа файл и присваиваем имя file
char*filename="c:\\1.txt"; //Объявлем переменную имя файла, эта переменная указавает на путь к файлу
char filetext[50]="none"; //Объявляем переменную текст файла.

file = fopen(filename, "r"); /*Открывает файл командой fopen, далее идет путь до файла и режим открытия, у нас это чтение */

if (fopen != 0) //Если удалось отрыть файл
{
fgets(filetext,120,file); //команда fgets присваивает пременной filetext содержимое файла
printf(filetext);
}
Else //Если файл не возможно открыть
{
printf("Ошибка окрытия файла"); //Ошибка
}
fclose(file); //После работы файл необходимо закрыть
}

Теперь эту функцию мы вмонтируем в наш пример:

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <time.h>

using namespace std;

char* Rus_simv(char st);
char *Rus_simv(char* st)
{
unsigned char* p = st;
while ( *p)
{
if (*p >= 192)
if (*p <= 239)
*p -=64;
else
*p -=16;
p++;
}
return st;
}

void file()
{
FILE *file;
char*filename="c:\\1.txt";
char filetext[50]="none";
file = fopen(filename, "r");

if (fopen != 0)
{
textcolor(RED);
textbackground(WHITE);
fgets(filetext,420,file);
cprintf(Rus_simv(filetext));
}
else
{
printf(Rus_simv("Файл не найден"));
}
fclose(file);
}

void main()
{
file();
cout << (Rus_simv("\n\nДля завершения программы щелкни на клавишу ")) ;
getch();
}

 

37. Файловый ввод данных в языке C++.38. Файловый вывод данных в языке C++.

Ввод-вывод файлов может выполняться как с помощью стандартных функций библиотеки Си, так и с помощью потоковввода-вывода. Функции библиотеки Си являются функциями низкого уровня, без всякого контроля типов.

Прежде чем перейти к рассмотрению собственно классов, остановимся на том, как осуществляются операции ввода-вывода с файлами. Файл рассматривается как последовательность байтов. Чтение или запись выполняются последовательно. Например, при чтении мы начинаем с начала файла. Предположим, первая операция чтения ввела 4 байта, интерпретированные как целое число. Тогда следующая операция чтения начнет ввод с пятого байта, и так далее до концафайла.



Аналогично происходит запись в файл – по умолчанию первая запись производится в конец имеющегося файла, а все последующие операции записи последовательно пишут данные друг за другом. При операциях чтения-записи говорят, что существует текущая позиция, начиная с которой будет производиться следующая операция.

Большинство файлов обладают возможностью прямого доступа. Это означает, что можно производить операции ввода-вывода не последовательно, а в произвольном порядке: после чтения первых 4-х байтов прочесть с 20 по 30, затем два последних и т.п. При написании программ на языке Си++ возможность прямого доступа обеспечивается тем, что текущую позицию чтения или записи можно установить явно.

В библиотеке Си++ для ввода-вывода файлов существуют классы ofstream (вывод) и ifstream (ввод). Оба они выведены из класса fstream. Сами операции ввода-вывода выполняются так же, как и для других потоков – операции >> и << определены для класса fstream как "ввести" и "вывести" соответствующее значение. Различия заключаются в том, как создаются объекты и как они привязываются к нужным файлам.

При выводе информации в файл первым делом нужно определить, в какой файл будет производиться вывод. Для этого можно использовать конструктор класса ofstream в виде:

ofstream(const char* szName,

int nMode = ios::out,

int nProt = filebuf::openprot);

Первый аргумент – имя выходного файла, и это единственный обязательный аргумент. Второй аргумент задает режим, в котором открывается поток. Этот аргумент – битовое ИЛИ следующих величин:

ios::app при записи данные добавляются в конец файла, даже если текущая позиция была перед этим перемещена;
ios::ate при создании потока текущая позиция помещается в конец файла ; однако, в отличие от режима app, запись ведется в текущую позицию;
ios::in поток создается для ввода; если файл уже существует, он сохраняется;
ios::out поток создается для вывода (режим по умолчанию);
ios::trunc если файл уже существует, его прежнее содержимое уничтожается, и длина файла становится равной нулю; режим действует по умолчанию, если не заданы ios::ate, ios::app или ios::in ;
ios::binary ввод-вывод будет происходить в двоичном виде, по умолчанию используется текстовое представление данных.

Третий аргумент используется только в том случае, если создается новый файл ; он определяет параметры создаваемого файла.

Можно создать поток вывода с помощью стандартного конструктора без аргументов, а позднее выполнить метод open с такими же аргументами, как у предыдущего конструктора:

void open(const char* szName,

int nMode = ios::out,

int nProt = filebuf::openprot);

Только после того, как поток создан и соединен с определенным файлом (либо с помощью конструктора с аргументами, либо с помощью метода open ), можно выполнять вывод. Выводятся данные операцией <<. Кроме того, данные можно вывести с помощью методов write или put:

ostream& write(const char* pch,

int nCount);

ostream& put(char ch);

Метод write выводит указанное количество байтов ( nCount ), расположенных в памяти, начиная с адреса pch. Метод put выводит один байт.

Для того чтобы переместить текущую позицию, используется метод seekp:

ostream& seekp(streamoff off,

ios::seek_dir dir);

Первый аргумент – целое число, смещение позиции в байтах. Второй аргумент определяет, откуда отсчитывается смещение; он может принимать одно из трех значений:

ios::beg смещение от начала файла
ios::cur смещение от текущей позиции
ios::end смещение от конца файла

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

После завершения вывода можно выполнить метод close, который выводит внутренние буферы в файл и отсоединяет поток от файла. То же самое происходит и при уничтожении объекта.

Класс ifstream, осуществляющий ввод из файлов, работает аналогично. При создании объекта типа ifstream в качестве аргумента конструктора можно задать имя существующего файла:

ifstream(const char* szName, int nMode = ios::in,

int nProt = filebuf::openprot);

Можно воспользоваться стандартным конструктором, а подсоединиться к файлу с помощью метода open.

Чтение из файла производится операцией >> или методами read или get:

istream& read(char* pch, int nCount);

istream& get(char& rch);

Метод read вводит указанное количество байтов ( nCount ) в память, начиная с адреса pch. Метод get вводит один байт.

Так же, как и для вывода, текущую позицию ввода можно изменить с помощью метода seekp, а по завершении выполнения операций закрыть файл с помощьюclose или просто уничтожить объект.

 





sdamzavas.net - 2020 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...