Вывод символов в текстовый файл 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Вывод символов в текстовый файл



Структуры. Файлы

( материал, который необходимо проработать до выполнения лабораторной работы )

 

Пример организации интерфейса в виде меню.. 2

Пример получения битового представления вещественного числа 4

Пример заполнения полей массива структур. 5

Более сложный пример использования массива структур. 6

Пример использования многофайловой компиляции. 9

Форматированный вывод в файл, используя <<. 11

Форматированное чтение из файла, используя >>. 11

Вывод символов в текстовый файл. 12

Ввод символов из текстового файла. 12

Вывод строк в текстовый файл. 12

Ввод из текстового файла строк. 13

Чтение и вывод на экран буфера текстового файла. 13

Пример использования функций, текстовых файлов и многофайловой компиляции. 13

Ввод-вывод в двоичный файл. 16

Пример использования функций, бинарных файлов и многофайловой компиляции 17

Аргументы командной строки. 19

Задание параметров программы в командной строке. 19

Возможные ошибки при записи в файл или чтении из него 20

Определение размера файла. 21

Удаление файла. 21

Переименование файла. 22

Пример организации интерфейса в виде меню

 
 

 

 

 
 

 

 

 


 

////////////////////////////////////////////////////////////////

 

Пример получения битового представления вещественного числа

 

#include <iostream>

 

void binary (double x); //вывод через объединение

Int main()

{

double x;

cout << "vvedite x" <<" ";

cin >> x;

binary (x);

_getch();

return 0;

}

Void binary (double x)

{ int j,i;

union {double ss;

unsigned char c[sizeof(double)];

} cod;

cod.ss=x;

for (j=sizeof (double)-1; j>=0; j--) {

cout<<"dvoichnoe predstavlenie byte"<<j<<":";

for (i=128;i;i>>=1) //проход по битам

if (i&cod.c[j]) cout<<"1"; //выделение бита

else cout<<"0";

cout<<"\n";

}

}

////////////////////////////////////////////////////////////////

//вывод через битовые поля

void binary_pole (unsigned char ch)
//вывод на экран двоичного представления байта

{ union { //определение локального объединяющего типа

unsigned char ss;

struct {

unsigned a0:1; //каждый бит получает название

unsigned a1:1;

unsigned a2:1;

unsigned a3:1;

unsigned a4:1;

unsigned a5:1;

unsigned a6:1;

unsigned a7:1;

} byte;

} cod; //определение локальный переменной-объединения

 

cod.ss=ch; //занесение в объединение значения аргумента функции

cout << "nomera bitov: 7 6 5 4 3 2 1 0\n";

cout <<"znachenie: ";

cout << " " << cod.byte.a7 << " " << cod.byte.a6; //так как все биты

cout << " " << cod.byte.a5 << " " << cod.byte.a4; //имеют названия

cout << " " << cod.byte.a3 << " " << cod.byte.a2;

cout << " " << cod.byte.a1 << " " << cod.byte.a0;

cout <<endl;

}

Пример заполнения полей массива структур

 

Пусть имеем описание моторной лодки в виде структуры:

 

Struct stboat

{

char szmodel[20]; //название модели лодки

char szserial[20]; //регистрационный номер

int iyear; // год изготовления лодки

long lmotor_hours; //наработанный ресурс мотора в часах

float fsaleprice; //цена

};

stboat stused_boat; //определение переменной stused_boatтипа stboat

 

Фрагмент программы для заполнения полей структуры и вывода их значений:

//struct1.h определение структурного типа

const int MAX=15;

struct stboat {

char szmodel[MAX];

char szserial[MAX];

int iyear;

long lmotor_hours;

float fsaleprice;

};

 

// stdafx.h:

#pragma once

#define WIN32_LEAN_AND_MEAN
// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <conio.h>

#include "struct1.h" // !!!подключаем определение структурного типа

using namespace std;

 

//main.cpp:

#include "stdafx.h"

int main()

{

stboat stused_boat [5]; //определение массива структур

for (int i=0;i<5; i++) //заполнение полей элементов массива структур

{

cout<<"model: "<< endl;

cin >> stused_boat[i].szmodel;

 

cout<<"nomer: "<< endl;

cin >> stused_boat[i].szserial;

 

cout<<"god: "<< endl;

cin >> stused_boat[i].iyear;

 

cout<<"narabotano chasov: "<< endl;

cin >> stused_boat[i].lmotor_hours;

 

cout<<"cena: "<< endl;

cin >> stused_boat[i].fsaleprice;

cout<<endl<< endl;

}

 

for (int i=0;i<5; i++) //вывод значений полей элементов массива структур

{

cout<<"sudno: "<< stused_boat[i].szmodel << "\tgod: " <<

stused_boat[i].iyear << "\tnomer: " <<
stused_boat[i].szserial << endl;

cout<<"narabotano chasov: "<< stused_boat[i].lmotor_hours <<
"\tprodano za $: " << stused_boat[i].fsaleprice << endl;

}

getch();

return(0);

}

 

////////////////////////////////////////////////////////////////

Более сложный пример использования массива структур

Структурный тип NameDataSet определен в заголовочном файле structura.h. В функции main() создается массив из 5 структур типа NameDataSet, после чего программа приглашает пользователя ввести необходимую информацию. Затем в теле цикла while происходит вызов функции getData (), которая ожидает ввода с клавиатуры содержимого элементов массива структур. Цикл прерывается, если getData () возврашает 0 или если количество заполненных элементов достигло максимального значения. После этого созданные структуры передаются (как элементы массива) функции displayData, которая выводит их на экран.

Функция getData() принимает по ссылке один элемент массива (аргумент типа NameDataSet), которому внутри функции присваивается имя nds. В функции getData() происходит считывание строки из устройства стандартного ввода с последующей его записью в член структуры firstName. Если stricmp() находит, что введенная строка есть "exit", функция getData() возвращает 0 в функцию main(), сигнализируя, что пора выходить из цикла ввода информации (функция stricmp() сравнивает строки, не обращая внимания на регистр). Если введена не строка "exit", функция считывает из стандартного ввода фамилию и номер кредитной карты и записывает их в структуру nds. Функция dispIayData () выводит на экран все члены структуры nds. Для этого ей (опять же по ссылке) передается каждый элемент массива структур.

 

// structura.h

// структура NameDataSet содержит имя клиента и номер кредитной карты

Struct NameDataSet

{

char firstName[128];

char lastName [128];

int creditCard;

};

/////////////////////////////////////////////

 

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

 

#include <iostream>

#include <string.h>

#include <conio.h>

#include "structura.h" // !!!подключаем определение структурного типа

using namespace std;

 

/////////////////////////////////////////////

 

// main.cpp:

#include "stdafx.h"

 

//getData() — вводит содержимое одного элемента массива структур NameDataSet

int getData(NameDataSet& nds);

 

//displayData()— выводит содержимое одного элемента массива структур

void displayData(NameDataSet& nds);

 

Int main()

{

const int MAX = 5;

NameDataSet nds[MAX]; // массив nds из 5 структур типа NameDataSet

 

cout << "read name/numer karty\n"

<< "input 'exit' v pole name for exit\n";

int index = 0; //считываем имена, фамилии и номера кредитных карт

while (index < MAX && getData(nds[index]))

{

index++;

}

cout << "\n elements:\n";

for (int i = 0; i < index; i++)

{

displayData(nds[i]);

}

_getch();

return 0;

}

 

///////////////////////////////////////////

int getData(NameDataSet& nds)

{

cout << "\nname: ";

cin >> nds.firstName;

if (stricmp(nds.firstName, "exit") == 0)

{

return 0;

}

cout << "FIO: ";

cin >> nds.lastName;

cout << "numer:";

cin >> nds.creditCard;

return 1;

}

//////////////////////////////////////////

void displayData(NameDataSet& nds)

{

cout << nds.firstName << " "<< nds.lastName

<< "/" << nds.creditCard << "\n";

}

////////////////////////////////////////////////////////////////

 

Пример использования многофайловой компиляции

1. Описать структуру с именем STUDENT, содержащую следующие поля:

· NAME – фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2. Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;

· упорядочение записей по алфавиту;

· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 3;

· если таких студентов нет, вывести соответствующее сообщение.

////////////////////////////////////////////////////////////////

//head.h константы, определение структурного типа, прототипы

const int KOL_ST = 10;

const int KOL_OC = 5;

const int BAL = 3;

struct student {

unsigned short gruppa;

char fio[20];

unsigned short ysp[KOL_OC];

};

 

//заполнение массива записей с информацией о студентах и их оценках

int vvod (student students[],const int kol_st, const int kol_oc);

 

//вывод из массива записей на экран информации о студентах c оценкой

// bal и количеством оценок kol_oc
int vivod (student students [], const int kol_st, const int kol_oc, const int bal);

 

//проверка наличия оценки bal среди массива оценок ysp размера kol_oc

int otsenka (unsigned short ysp[],const int kol_oc,const int bal);

 

//вспомогательная функция для стандартной функции сортировки qsort()

int compare( const void *arg1, const void *arg2 );

////////////////////////////////////////////////////////////////

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN//Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <iostream>

#include <iomanip>

#include <conio.h>

#include "head.h" //!!!подключаем заголовочный файл

using namespace std;

////////////////////////////////////////////////////////////////

//func.cpp

#include "stdafx.h"

//функция получает массив записей о студентах, их количество и //количество предметов

int vvod (student *students,const int kol_st,const int kol_oc) {

 

for (int i=0;i<kol_st;i++) {

cout <<"vvedite fio studenta #"<<i+1<<" ";

cin >>students[i].fio;

cout <<"vvedite gryppy studenta #"<<i+1<<" ";

cin >>students[i].gruppa;

cout <<"\tvsego otsenok: "<< kol_oc <<endl;

cout <<"vvedite otsenki studenta #"<<i+1<<endl;

for (int j=0;j<kol_oc;j++){

cin >>students[i].ysp[j];

}

}

return 0;

}

 

int vivod (student *students,const int kol_st,const int kol_oc, const int bal) {

int i,j;

bool prov;

for (i=0;i< kol_st;i++){

if (otsenka(students[i].ysp,kol_oc,bal)) {

prov=true;

cout<<"student " << setw(15) << students[i].fio

<< " iz "<<students[i].gruppa

<<"-y gruppi imeet hotya bi odny troiky"<<endl;

}

}

if (!prov) cout<<" net studentov, imeyuschih troiki"<<endl;

return 0;

}

 

int otsenka (unsigned short ysp[],const int kol_oc, const int bal) {

for (int i=0;i<kol_oc;i++){

if (ysp[i]==bal) return 1;

}

return 0;

}

 

//сравниваем поля с фамилиями

int compare (const void *arg1, const void *arg2)

{ return _stricmp ((char*)(((student*)arg1)->fio),
(char*)(((student*)arg2)->fio));

}

////////////////////////////////////////////////////////////////

//main.cpp

#include "stdafx.h"

int main () {

student students[KOL_ST]; //определение масссива записей о студентах

vvod (students,KOL_ST,KOL_OC);

qsort (students, KOL_ST, sizeof(student), compare);

vivod (students,KOL_ST,KOL_OC,BAL);

_getch();

return 0;

} //

////////////////////////////////////////////////////////////////

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

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

char ch = 'x';

int j = 77;

double d = 6.02;

string str1 = "Kafka"; //строки-объекты с выделенной памятью

string str2 = "Proust";

 

ofstream outfile ("fdata.txt"); //создание потока outfile

outfile << ch //запись данных в поток

<< j

<< ' ' //пробел между числами

<< d

<< str1

<< ' ' // пробел между строками

<< str2;

cout << "File written\n";

_getch();

return 0; //при завершении программы файл будет закрыт

}

////////////////////////////////////////////////////////////////

Форматированное чтение из файла, используя >>

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

 

int main()

{

char ch;

int j;

double d;

string str1;

string str2;

 

ifstream infile ("fdata.txt"); //создание потока класса ifstream

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

infile >> ch >> j >> d >> str1 >> str2;

 

cout << ch << endl //вывод данных на экран

<< j << endl

<< d << endl

<< str1 << endl

<< str2 << endl;

_getch();

return 0;

} //при завершении программы файл будет закрыт

 

 

////////////////////////////////////////////////////////////////

Пример использования функций, текстовых файлов и многофайловой компиляции

1. Описать структуру с именем STUDENT, содержащую следующие поля:

· NAME – фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2. Написать программу, выполняющую следующие действия:

· вывод десяти структур данных типа STUDENT с клавиатуры в файл;

· чтение из файла и вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 3;

· если таких студентов нет, вывести соответствующее сообщение.

////////////////////////////////////////////////////////////////

 

//head.h константы, определение структурного типа, прототипы функций

const int KOL_ST = 10;

const int KOL_OC = 5;

const int BAL = 3;

struct student {

unsigned short gruppa;

char fio[20];

unsigned short ysp[KOL_OC];

};

 

int vivod_file_txt (char [],const int, const int);

int vvod_file_txt (char[],const int, const int);

int otsenka (unsigned short [],const int,const int);

////////////////////////////////////////////////////////////////

// stdafx.h

#pragma once

 

#define WIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <iostream>

#include <fstream>

#include <iomanip>

#include <conio.h>

#include "head.h"

using namespace std;

////////////////////////////////////////////////////////////////

//func.cpp

#include "stdafx.h"

int vivod_file_txt (char name_file[],const int kol_st,
const int kol_oc)

{

ofstream outfile (name_file);

if (!outfile) {

cout <<"error ofstream"<<endl;

_getch();

return 1;

}

student stud; //определение структуры

for (int i=0; i<kol_st; i++) { //заполнение полей структуры

cout <<"vvedite fio studenta #"<<i+1<<" ";

cin >>stud.fio; //чтение поля структуры с клавиатуры

outfile << stud.fio <<' \n '; //запись поля структуры в файл

 

cout << "vvedite gryppy studenta #"<<i+1<<" ";

cin >> stud.gruppa;

outfile << stud.gruppa <<' \n ';

 

cout <<"vvedite otsenki studenta #"<<i+1<<endl;

for (int j=0; j<kol_oc; j++)

{cin >>stud.ysp[j];

outfile << stud.ysp[j] <<' \n ';

}

 

}

cout << "file is made \n" << endl;

outfile.close();

return 0;

}

 

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

int vvod_file_txt (char name_file[],const int kol_oc, const int bal) {

bool prov = false;

ifstream infile (name_file);

if(!infile) {

cout<<"error ifstream"<< endl;

_getch();

return 1;

}

student stud;

while (true) {

infile >> stud.fio;

if (infile.eof()) break; //проверка по stud.fio на конец файла

infile >> stud. gruppa;

for (int j=0; j<kol_oc; j++)

infile >>stud.ysp[j];

if (otsenka(stud.ysp,kol_oc,bal)) {

prov = true;

cout << "student " << setw(15) << stud.fio

<< " iz " << stud.gruppa

<< "-y gruppi imeet hotya bi odny troiky" << endl;

}

}

 

if (!prov) cout << "net studentov, imeyuschih troiki" << endl;

infile.close ();

return 0;

 

}

int otsenka (unsigned short ysp[],const int kol_oc, const int bal) {

for (int i=0;i<kol_oc;i++){

if (ysp[i]==bal) return 1;

}

return 0;

}

 

////////////////////////////////////////////////////////////////

//main.cpp

 

#include "stdafx.h"

int main () {

char name_file[20]; //имя файла

 

cout <<"vvedite imya faila: ";

cin.getline (name_file,20);

 

if (vivod_file_txt ( name_file,KOL_ST,KOL_OC ))

{cout <<"error vivod_file_txt() "<<endl;

_getch();

return 1;

}

else if (vvod_file_txt ( name_file,KOL_OC, BAL ))

{ cout <<"error vvod_file_txt() "<<endl;

_getch();

return 2;

}

else

_getch();

return 0;

}

 

////////////////////////////////////////////////////////////////

Ввод-вывод в двоичный файл

 

#include <fstream>

#include <iostream>

using namespace std;

const int MAX = 100; //размер буфера

int buff[MAX]; //буфер для данных

 

int main()

{

for(int j=0; j<MAX; j++) //заполнение буфера данных

buff[j] = j; //(0, 1, 2,...)

// создание потока вывода

ofstream os ("edata.dat", ios::binary);

//вывод из буфера в поток

os.write(reinterpret_cast<char*>(buff), MAX*sizeof(int));

os.close(); //закрыть поток

 

for(int j=0; j<MAX; j++) //очистка буфера

buff[j] = 0;

//создание потока ввода

ifstream is ("edata.dat", ios::binary);

//чтение из потока в буфер

is.read(reinterpret_cast<char*>(buff), MAX*sizeof(int));

 

for(int j=0; j<MAX; j++) //проверка данных

if(buff[j]!= j)

{ cerr << "Data is incorrect\n"; return 1; }

cout << "Data is correct\n";

_getch();

return 0; //при завершении программы файл будет закрыт

}

 

////////////////////////////////////////////////////////////////

Пример использования функций, бинарных файлов и многофайловой компиляции

1. Описать структуру с именем STUDENT, содержащую следующие поля:

· NAME – фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2. Написать программу, выполняющую следующие действия:

· ввод десяти структур данных типа STUDENT с клавиатуры в файл;

· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 3;

· если таких студентов нет, вывести соответствующее сообщение.

////////////////////////////////////////////////////////////////

//head.h

 

const int KOL_ST = 10;

const int KOL_OC = 5;

const int BAL = 3;

 

struct student {

unsigned short gruppa;

char fio[20];

unsigned short ysp[KOL_OC];

};

 

int vivod_file (char [],const int, const int);

int vvod_file (char[],const int, const int);

int otsenka (unsigned short [],const int,const int);

////////////////////////////////////////////////////////////////

// stdafx.h

#pragma once

 

#define WIN32_LEAN_AND_MEA// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <iostream>

#include <fstream>

#include <iomanip>

#include <conio.h>

#include "head.h"

using namespace std;

////////////////////////////////////////////////////////////////

//func.cpp

#include "stdafx.h"

int vivod_file (char name_file[],const int kol_st,const int kol_oc) {

 

ofstream file (name_file,ios::binary|ios::out);

if (!file) {

cout <<"error ofstream"<<endl;

_getch();

return 1;

}

student stud; //определение структуры

for (int i=0; i<kol_st; i++) {//цикл заполнения полей структуры

cout <<"vvedite fio studenta #"<<i+1<<" ";

cin >>stud.fio;

cout <<"vvedite gryppy studenta #"<<i+1<<" ";

cin >>stud.gruppa;

cout <<"vvedite otsenki studenta #"<<i+1<<endl;

for (int j=0; j<kol_oc; j++)

cin >>stud.ysp[j];

file.write (reinterpret_cast< char* >(&stud), sizeof (student));

//вывод в файл заполненной структуры

}

cout << "file is made \n" << endl;

file.close();

return 0;

}

 

int vvod_file (char name_file[],const int kol_oc, const int bal) {

bool prov = false;

ifstream file (name_file,ios::binary|ios::in);

if(!file) {

cout<<"error ifstream"<< endl;

_getch();

return 1;

}

student stud;

while (true) {

file.read (reinterpret_cast< char* > (&stud), sizeof (student));

if (file.eof()) break;

if (otsenka(stud.ysp,kol_oc,bal)) {

prov = true;

cout << "student " << setw(15) << stud.fio

<< " iz " << stud.gruppa

<< "-y gruppi imeet hotya bi odny troiky" << endl;

}

}

if (!prov) cout << "net studentov, imeyuschih troiki" << endl;

return 0;

}

int otsenka (unsigned short ysp[],const int kol_oc, const int bal) {

for (int i=0;i<kol_oc;i++){

if (ysp[i]==bal) return 1;

}

return 0;

}

////////////////////////////////////////////////////////////////

//main.cpp

 

#include "stdafx.h"

 

int main () {

char name_file[20]; //имя файла

 

cout <<"vvedite imya faila: ";

cin.getline (name_file,20);

if (vivod_file ( name_file,KOL_ST,KOL_OC ))

{cout <<"error vivod_file() "<<endl;

_getch();

return 1;

}

else if (vvod_file ( name_file,KOL_OC, BAL ))

{ cout <<"error vvod_file() "<<endl;

_getch();

return 2;

}

else

_getch();

return 0;

 

}

////////////////////////////////////////////////////////////////

 

Аргументы командной строки

using namespace std;

int main(int argc, char* argv[])

{

cout << "\nargc = " << argc << endl; //количество аргументов

 

for(int j=0; j<argc; j++) //вывод аргументов

cout << "Argument " << j << " = " << argv[j] << endl;

return 0;

}

////////////////////////////////////////////////////////////////

Задание параметров программы в командной строке

Задание аргумента при выполнении программы в среде MS Visual C++ 2005 осуществляется следующим образом:

· вокне Solution Explorer выделить проект (щелкнуть на названии проекта)à

· в меню Project àвыбрать команду Properties à

· в открывшемся окне Property Pages выбрать команду Debugging à

· в появившейся таблице в поле Command Arguments ввести строку аргументовдля программы.

 

 

//в программе в качестве аргумента функции main() задается путь
// к текстовому файлу

//в командной строке задано proba.txt (для файла из текущей папки)

#include <iostream>

#include <conio.h>

using namespace std;

 

int main(int argc,char *argv[])

{

if (!(argc >=2))

{

cout<<"arguments? \n";

_getch();

return 1;

}

 

ifstream fp(argv[1]);

cout<<"+++++++++++++++++++++++++++++++++++++++++++++\n";

cout<<argv[1]<<endl;

cout<<"+++++++++++++++++++++++++++++++++++++++++++++\n";

 

if (!fp)

{

cout<<"error of open file";

_getch();

return 1;

}

......

}

 

////////////////////////////////////////////////////////////////

Определение размера файла

#include <fstream>

#include <iostream>

using namespace std;

#include <process.h> //для exit()

 

int main(int argc, char* argv[])

{

if(argc!= 2)

{ cerr << "\nFormat: filename\n"; _getch(); exit(-1); }

ifstream infile; //создание потока ввода

infile.open(argv[1]); //открыть файл c именем аргумента

if(!infile) //если ошибка ввода

{ cerr << "\nCan't open " << argv[1];_getch(); exit(-1); }

infile.seekg(0, ios::end); //переход в конец файла

// вывод номера позиции курсора

cout << "Size of " << argv[1] << " is " << infile.tellg();

cout << endl;

_getch();

return 0;

}

 

////////////////////////////////////////////////////////////////

Удаление файла

Int remove(

const char * path

); //0, если успешно

 

int main()

{

if(!remove("TEST.txt"))

cout<<"Could not delete 'TEST.txt'"<<endl;

else

cout<<"Deleted 'TEST.txt'"<<endl;

_getch();

return 0;

}

////////////////////////////////////////////////////////////////

Переименование файла

int rename(const char * oldname, const char * newname );

//0, если успешно

 

rename("file_old", "file_new");

 

Структуры. Файлы

( материал, который необходимо проработать до выполнения лабораторной работы )

 

Пример организации интерфейса в виде меню.. 2

Пример получения битового представления вещественного числа 4

Пример заполнения полей массива структур. 5

Более сложный пример использования массива структур. 6

Пример использования многофайловой компиляции. 9

Форматированный вывод в файл, используя <<. 11

Форматированное чтение из файла, используя >>. 11

Вывод символов в текстовый файл. 12

Ввод символов из текстового файла. 12

Вывод строк в текстовый файл. 12

Ввод из текстового файла строк. 13

Чтение и вывод на экран буфера текстового файла. 13

Пример использования функций, текстовых файлов и многофайловой компиляции. 13

Ввод-вывод в двоичный файл. 16

Пример использования функций, бинарных файлов и многофайловой компиляции 17

Аргументы командной строки. 19

Задание параметров программы в командной строке. 19

Возможные ошибки при записи в файл или чтении из него 20

Определение размера файла. 21

Удаление файла. 21

Переименование файла. 22

Пример организации интерфейса в виде меню

 
 

 

 

 
 

 

 

 


 

////////////////////////////////////////////////////////////////

 

Пример получения битового представления вещественного числа

 

#include <iostream>

 

void binary (double x); //вывод через объединение

Int main()

{

double x;

cout << "vvedite x" <<" ";

cin >> x;

binary (x);

_getch();

return 0;

}

Void binary (double x)

{ int j,i;

union {double ss;

unsigned char c[sizeof(double)];

} cod;

cod.ss=x;

for (j=sizeof (double)-1; j>=0; j--) {

cout<<"dvoichnoe predstavlenie byte"<<j<<":";

for (i=128;i;i>>=1) //проход по битам

if (i&cod.c[j]) cout<<"1"; //выделение бита

else cout<<"0";

cout<<"\n";

}

}

////////////////////////////////////////////////////////////////

//вывод через битовые поля

void binary_pole (unsigned char ch)
//вывод на экран двоичного представления байта

{ union { //определение локального объединяющего типа

unsigned char ss;

struct {

unsigned a0:1; //каждый бит получает название

unsigned a1:1;

unsigned a2:1;

unsigned a3:1;

unsigned a4:1;

unsigned a5:1;

unsigned a6:1;

unsigned a7:1;

} byte;

} cod; //определение локальный переменной-объединения

 

cod.ss=ch; //занесение в объединение значения аргумента функции

cout << "nomera bitov: 7 6 5 4 3 2 1 0\n";

cout <<"znachenie: ";

cout << " " << cod.byte.a7 << " " << cod.byte.a6; //так как все биты

cout << " " << cod.byte.a5 << " " << cod.byte.a4; //имеют названия

cout << " " << cod.byte.a3 << " " << cod.byte.a2;

cout << " " << cod.byte.a1 << " " << cod.byte.a0;

cout <<endl;

}

Пример заполнения полей массива структур

 

Пусть имеем описание моторной лодки в виде структуры:

 

Struct stboat

{

char szmodel[20]; //название модели лодки

char szserial[20]; //регистрационный номер

int iyear; // год изготовления лодки

long lmotor_hours; //наработанный ресурс мотора в часах

float fsaleprice; //цена

};

stboat stused_boat; //определение переменной stused_boatтипа stboat

 

Фрагмент программы для заполнения полей структуры и вывода их значений:

//struct1.h определение структурного типа

const int MAX=15;

struct stboat {

char szmodel[MAX];

char szserial[MAX];

int iyear;

long lmotor_hours;

float fsaleprice;

};

 

// stdafx.h:

#pragma once

#define WIN32_LEAN_AND_MEAN
// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <conio.h>

#include "struct1.h" // !!!подключаем определение структурного типа

using namespace std;

 

//main.cpp:

#include "stdafx.h"

int main()

{

stboat stused_boat [5]; //определение массива структур

for (int i=0;i<5; i++) //заполнение полей элементов массива структур

{

cout<<"model: "<< endl;

cin >> stused_boat[i].szmodel;

 

cout<<"nomer: "<< endl;

cin >> stused_boat[i].szserial;

 

cout<<"god: "<< endl;

cin >> stused_boat[i].iyear;

 

cout<<"narabotano chasov: "<< endl;

cin >> stused_boat[i].lmotor_hours;

 

cout<<"cena: "<< endl;

cin >> stused_boat[i].fsaleprice;

cout<<endl<< endl;

}

 

for (int i=0;i<5; i++) //вывод значений полей элементов массива структур

{

cout<<"sudno: "<< stused_boat[i].szmodel << "\tgod: " <<

stused_boat[i].iyear << "\tnomer: " <<
stused_boat[i].szserial << endl;

cout<<"narabotano chasov: "<< stused_boat[i].lmotor_hours <<
"\tprodano za $: " << stused_boat[i].fsaleprice << endl;

}

getch();

return(0);

}

 

////////////////////////////////////////////////////////////////

Более сложный пример использования массива структур

Структурный тип NameDataSet определен в заголовочном файле structura.h. В функции main() создается массив из 5 структур типа NameDataSet, после чего программа приглашает пользователя ввести необходимую информацию. Затем в теле цикла while происходит вызов функции getData (), которая ожидает ввода с клавиатуры содержимого элементов массива структур. Цикл прерывается, если getData () возврашает 0 или если количество заполненных элементов достигло максимального значения. После этого созданные структуры передаются (как элементы массива) функции displayData, которая выводит их на экран.

Функция getData() принимает по ссылке один элемент массива (аргумент типа NameDataSet), которому внутри функции присваивается имя nds. В функции getData() происходит считывание строки из устройства стандартного ввода с последующей его записью в член структуры firstName. Если stricmp() находит, что введенная строка есть "exit", функция getData() возвращает 0 в функцию main(), сигнализируя, что пора выходить из цикла ввода информации (функция stricmp() сравнивает строки, не обращая внимания на регистр). Если введена не строка "exit", функция считывает из стандартного ввода фамилию и номер кредитной карты и записывает их в структуру nds. Функция dispIayData () выводит на экран все члены структуры nds. Для этого ей (опять же по ссылке) передается каждый элемент массива структур.

 

// structura.h

// структура NameDataSet содержит имя клиента и номер кредитной карты

Struct NameDataSet

{

char firstName[128];

char lastName [128];

int creditCard;

};

/////////////////////////////////////////////

 

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN// Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

 

#include <iostream>

#include <string.h>

#include <conio.h>

#include "structura.h" // !!!подключаем определение структурного типа

using namespace std;

 

/////////////////////////////////////////////

 

// main.cpp:

#include "stdafx.h"

 

//getData() — вводит содержимое одного элемента массива структур NameDataSet

int getData(NameDataSet& nds);

 

//displayData()— выводит содержимое одного элемента массива структур

void displayData(NameDataSet& nds);

 

Int main()

{

const int MAX = 5;

NameDataSet nds[MAX]; // массив nds из 5 структур типа NameDataSet

 

cout << "read name/numer karty\n"

<< "input 'exit' v pole name for exit\n";

int index = 0; //считываем имена, фамилии и номера кредитных карт

while (index < MAX && getData(nds[index]))

{

index++;

}

cout << "\n elements:\n";

for (int i = 0; i < index; i++)

{

displayData(nds[i]);

}

_getch();

return 0;

}

 

///////////////////////////////////////////

int getData(NameDataSet& nds)

{

cout << "\nname: ";

cin >> nds.firstName;

if (stricmp(nds.firstName, "exit") == 0)

{

return 0;

}

cout << "FIO: ";

cin >> nds.lastName;

cout << "numer:";

cin >> nds.creditCard;

return 1;

}

//////////////////////////////////////////

void displayData(NameDataSet& nds)

{

cout << nds.firstName << " "<< nds.lastName

<< "/" << nds.creditCard << "\n";

}

////////////////////////////////////////////////////////////////

 

Пример использования многофайловой компиляции

1. Описать структуру с именем STUDENT, содержащую следующие поля:

· NAME – фамилия и инициалы;

· номер группы;

· успеваемость (массив из пяти элементов).

2. Написать программу, выполняющую следующие действия:

· ввод с клавиатуры данных в массив, состоящий из десяти структур типа STUDENT;

· упорядочение записей по алфавиту;

· вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 3;

· если таких студентов нет, вывести соответствующее сообщение.

////////////////////////////////////////////////////////////////

//head.h константы, определение структурного типа, прототипы

const int KOL_ST = 10;

const int KOL_OC = 5;

const int BAL = 3;

struct student {

unsigned short gruppa;

char fio[20];

unsigned short ysp[KOL_OC];

};

 

//заполнение массива записей с информацией о студентах и их оценках

int vvod (student students[],const int kol_st, const int kol_oc);

 

//вывод из массива записей на экран информации о студентах c оценкой

// bal и количеством оценок kol_oc
int vivod (student students [], const int kol_st, const int kol_oc, const int bal);

 

//проверка наличия оценки bal среди массива оценок ysp размера kol_oc

int otsenka (unsigned short ysp[],const int kol_oc,const int bal);

 

//вспомогательная функция для стандартной функции сортировки qsort()

int compare( const void *arg1, const void *arg2 );

////////////////////////////////////////////////////////////////

// stdafx.h

#pragma once

#define WIN32_LEAN_AND_MEAN//Exclude rarely-used stuff from Windows headers

#include <stdio.h>

#include <tchar.h>

 

// TODO: reference additional headers your program requires here

#include <iostream>

#include <iomanip>

#include <conio.h>

#include "head.h" //!!!подключаем заголовочный файл

using namespace std;

////////////////////////////////////////////////////////////////

//func.cpp

#include "stdafx.h"

//функция получает массив записей о студентах, их количество и //количество предметов

int vvod (student *students,const int kol_st,const int kol_oc) {

 

for (int i=0;i<kol_st;i++) {

cout <<"vvedite fio studenta #"<<i+1<<" ";

cin >>students[i].fio;

cout <<"vvedite gryppy studenta #"<<i+1<<" ";

cin >>students[i].gruppa;

cout <<"\tvsego otsenok: "<< kol_oc <<endl;

cout <<"vvedite otsenki studenta #"<<i+1<<endl;

for (int j=0;j<kol_oc;j++){

cin >>students[i].ysp[j];

}

}

return 0;

}

 

int vivod (student *students,const int kol_st,const int kol_oc, const int bal) {

int i,j;

bool prov;

for (i=0;i< kol_st;i++){

if (otsenka(students[i].ysp,kol_oc,bal)) {

prov=true;

cout<<"student " << setw(15) << students[i].fio

<< " iz "<<students[i].gruppa

<<"-y gruppi imeet hotya bi odny troiky"<<endl;

}

}

if (!prov) cout<<" net studentov, imeyuschih troiki"<<endl;

return 0;

}

 

int otsenka (unsigned short ysp[],const int kol_oc, const int bal) {

for (int i=0;i<kol_oc;i++){

if (ysp[i]==bal) return 1;

}

return 0;

}

 

//сравниваем поля с фамилиями

int compare (const void *arg1, const void *arg2)

{ return _stricmp ((char*)(((student*)arg1)->fio),
(char*)(((student*)arg2)->fio));

}

////////////////////////////////////////////////////////////////

//main.cpp

#include "stdafx.h"

int main () {

student students[KOL_ST]; //определение масссива записей о студентах

vvod (students,KOL_ST,KOL_OC);

qsort (students, KOL_ST, sizeof(student), compare);

vivod (students,KOL_ST,KOL_OC,BAL);

_getch();

return 0;

} //

////////////////////////////////////////////



Поделиться:


Последнее изменение этой страницы: 2016-12-17; просмотров: 147; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 52.14.224.197 (0.925 с.)