WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 7 | 8 || 10 | 11 |

// узнаем сколько чисел в файле int r,n=0;

while (!feof(fp)) // пока не конец файла { fscanf(fp,"%d",&r); n++;

} fclose(fp); // закрываем файл int *mx= new int [n]; // динамический массив из n элементов fp=fopen(fileName,"r"); // снова открываем // чтение из файла for (int i=0;i

mx[i]=r;

} fclose(fp);

// печать:

for (int i=0;i

Пример. Чтение данных из файла в двумерный массив. Количество данных известно или их в файле больше. Числа записаны в файле в виде матрицы.

// Чтение данных из файла в двумерный массив // количество данных известно или их в файле больше FILE *fp;

char * fileName="d:\\temp\\matrnn.txt";

fp=fopen(fileName,"r");

const int n=5;

int ma[n][n], r;

// чтение из файла for (int i=0;i

ma[i][j]=r;

} fclose(fp);

// печать:

for (int i=0;i

printf("\n");

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

// Чтение данных из файла в массив // количество данных неизвестно FILE *fp;

char * fileName="d:\\temp\\matrnn.txt";

fp=fopen(fileName,"r");

// узнаем сколько чисел в файле int n=0;

int r;

while (!feof(fp)) // пока не конец файла { fscanf(fp,"%d",&r); n++;

} fclose(fp); // закрываем файл // вычисляем размер матрицы int m = (int)sqrt((double)n);

printf("\n n=%d m=%d",n,m);

// динамический массив из m*m элементов:

int **mx= new int* [m];

for (int i=0;i

fp=fopen(fileName,"r"); // снова открываем файл // чтение из файла for (int i=0;i

mx[i][j]=r;

} fclose(fp);

for (int i=0;i

printf("\n");

} Пример. Чтение из файла. Функция isalpha(ch) возвращает истинное значение, если параметр ch является символом алфавита.

#include #include #include #include using namespace std;

FILE *f;

int get_word(char *);

int main() { char word[80];/* слово, выделенное из файла */ int kol=0; /* количество слов в в файле */ if((f=fopen("readme.txt","r"))==NULL){printf("FileError!!!"); return 1;} while (get_word(word)) {/* цикл продолжается пока get_word() не равно 0*/ kol++; cout<

} fclose(f);

return 0;

} int get_word(char *a) { /* возвращает 1, если из файла прочитано слово*/ /* слово передается через параметр a*/ char ch, i=1;

while (!isalpha(ch=getc(f))&&ch!=EOF);

if(ch==EOF) return 0;/* файл кончился*/ a[0]=ch;

while(isalpha(ch=getc(f))&&ch!=EOF) a[i++]=ch;

a[i]='\0';

return 1;

} Запись в файл Для записи в файл можно использовать функцию fprintf(). В отличие от функции printf(), аналогом которой она является, присутствует еще один параметр – указатель на файл, в который будет производиться запись.

Пример. Запись в файл матрицы целых чисел. В программе числа созданы с помощью генератора случайных чисел.

// Запись матрицы в файл // FILE *fp;

char * fileName="d:\\temp\\resA.txt";

fp=fopen(fileName,"w");

// заполнение массива числами const int n=4;

int a[n][n];

for (int i=0;i

// запись в файл for (int i=0;i

fclose(fp);

Пример. Запись в файл матрицы чисел с плавающей точкой. Числа создаются с помощью генератора случайных чисел. Запись в файл производится построчно – каждая строка матрицы с новой строки.

/* Запись матрицы в файл.

Каждая строка матрицы - перевод на новую строку в файле */ // FILE *fp;

char * fileName="d:\\temp\\resAA.txt";

fp=fopen(fileName,"w");

// заполнение массива числами const int n=4;

double a[n][n];

for (int i=0;i

// запись в файл for (int i=0;i

// или fprintf(fp,"%e ",a[i][j]);

fprintf(fp,"\n");

} fclose(fp);

Файловый ввод и вывод в C++ Для работы с файлами в C++, прежде всего, необходимо включить в программу заголовочный файл fstream.h. Этот файл содержит описание классов istream (файловый ввод) и ofstream (файловый вывод). Все операции с файлами осуществляются через объекты этих классов вызовом соответствующих методов.

Пример. Этот пример является аналогом примера, приведенного ранее для иллюстрации работы fprintf().

#include #include using namespace std;

int main() { // запись в файл ofstream fout("c:\\tmp\\result.txt");

if(!fout){ cout<<"\n Нельзя создать файл";

return 1;

} int x;

for (int i=0;i<10;i++){ x=i*2;

fout<

} fout.close();

} Пример. Чтение данных из файла в массив. Количество данных известно.

char * fileName="d:\\temp\\dann.txt";

ifstream fin(fileName); // открытие файла для ввода const int n=6;

int mx[n];

// чтение из файла for (int i=0;i>mx[i];



fin.close();

// печать:

for (int i=0;i

cout<<"\n";

Пример. Чтение данных из файла в массив. Количество данных неизвестно. Ранее, в одном из примеров, эта операция была выполнена с помощью функций fscanf() и feof(). Файл открывается дважды:

сначала для вычисления количество элементов в файле, а затем – для считывания данных в динамический массив.

char * fileName="d:\\temp\\dannn.txt";

ifstream fin(fileName); // открытие файла // узнаем сколько чисел в файле int r,n=0;

while (!fin.eof()) // пока не конец файла { fin>>r; n++;

} fin.close(); // закрываем файл // int *mx= new int [n]; // динамический массив ifstream fin2(fileName); // снова открываем файл // чтение из файла for (int i=0;i>mx[i];

fin2.close(); // закрываем файл // печать:

for (int i=0;i

Пример. Запись в файл матрицы чисел с плавающей точкой. Числа создаются с помощью генератора случайных чисел. Запись в файл производится построчно – каждая строка матрицы с новой строки.

// Запись матрицы в файл // char * fileName="d:\\temp\\resAA.txt";

ofstream fout(fileName);

// заполнение массива числами const int n=4;

double a[n][n];

for (int i=0;i

// запись в файл for (int i=0;i fout<<"\n";

} fout.close();

Пример. Подсчет числа слов в текстовом файле.

// Подсчет числа слов в текстовом файле // setlocale(LC_CTYPE, "rus"); // русификация консоли ifstream in("d:\\temp\\poem.txt");

if(!in) { cout << "\n Ошибка открытия файла";

return 1; } int count = 0; unsigned char ch;

in >> ch; // нахождение первого символа не пробела in.unsetf(ios::skipws); // не пропускать пробелы while(!in.eof()) { in >> ch;

if(isspace(ch)|| in.eof()) { count++;

while(isspace(ch) && !in.eof()) in >> ch;/* пропускаем пробелы */ } } cout << "Всего слов: " << count << '\n';

in.close();

Раздельная компиляция Раздельная компиляция применяется для разделения программы на несколько файлов с возможностью отдельной компиляции каждого из них и объединением в одно целое (например, exe–файл) на заключительном этапе (подробнее, см., напр., Прата С., Язык программирования С++, Стауструп Б.

Язык программирования C++).

На примере небольшого проекта рассмотрим процесс создания многофайлового проекта. В программе вводятся координаты точки (числа x и y) и вычисляются: расстояние от начала координат и угол с координатной осью (полярные координаты). Проект будет состоять из трех файлов mycoord.cpp, mytypes.h и myfunctions.cpp. В файле mycoord.cpp, содержащем функцию main(), выполняется ввод координат, вызов необходимых функций вычисления и отображение результатов. В файл mytypes.h будут помещены объявления типов struct polar – для полярных координат и struct rect – для декартовых. Прототипы функций также разместим в этом файле.

Определения функций запишем в отдельный файл с именем myfunctions.cpp.

В MS Visual Studio 2010 процесс создания многофайлового проекта состоит из нескольких шагов.

На первом шаге создаем проект с именем mycoord.

Среда программирования генерирует шаблон консольного приложения // mycoord.cpp: определяет точку входа для консольного приложения.

// #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0;

} Создаем заголовочный файл mytypes.h, в который записываем объявления типов. Для этого в меню Проект (Project) выбираем раздел Добавить новый элемент…. (Add New Item…) В окне диалога выбираем элемент Заголовочный файл (.h) (Header File (.h)), вводим имя заголовочного файла mytypes.h и заканчиваем диалог нажатием кнопки Добавить.

Набираем определения типов // mytypes.h #ifndef MYTYPES_H_ #define MYTYPES_H_ struct polar { double distance;// расстояние от начала координат double angle; // угол };

struct rect { double x; // расстояние по горизонтали double y; // расстояние по вертикали };

// прототипы функций:

polar rect_to_polar(rect xy);

void show_polar(polar da);

#endif Обращаем внимание на стражи включения #ifndef MYTYPES_H_ #define MYTYPES_H_ ….

#endif Эта конструкция уже описывалась в разделе Директивы препроцессора.

Заголовочный файл следует включать в проект только один раз. Если какието заголовочные файлы включают (с помощью #include) другие заголовочные файлы, то это правило трудно проконтролировать.

Стандартная методика предотвращения многократных включений заголовочных файлов, основана на использовании стражей включения – директив препроцессора #ifndef и #endif.

На следующем шаге создаем файл с кодом, реализующим функции, объявленные в заголовочном файле. Для этого снова вызываем диалог добавления нового элемента с помощью меню Проект (Project) выбираем раздел Добавить новый элемент…. (Add New Item…), но на этот раз выбираем элемент Файл C++ (.cpp), а затем вводим имя файла myfunctions.cpp и набираем код:

#include "stdafx.h" #include #include #include "mytypes.h" using namespace std;

polar rect_to_polar(rect xy) { polar coord;

coord.distance = sqrt(xy.x * xy.x + xy.y * xy.y);

coord.angle = atan2(xy.y, xy.x);

return coord;

} void show_polar (polar dapos) { const double Rad_to_deg = 57.29577951;





cout << "Расстояние = " << dapos.distance;

cout << ", угол = " << dapos.angle * Rad_to_deg;

cout << " градусов\n";

} Теперь переключаемся в окно файла mycoord.cpp добавляем #include “mytypes.h” #include using namespace std;

а в функции main() записываем код обработки данных:

#include "stdafx.h" #include "mytypes.h" #include using namespace std;

int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, "rus"); // русификация консоли rect rplace;

polar pplace;

cout << "\nВедите координаты x и y: ";

while (cin >> rplace.x >> rplace.y) { pplace = rect_to_polar(rplace);

show_polar(pplace);

cout << "Введите следующие координаты (или q, чтобы закончить): ";

} return 0;

} Что включать в заголовочный файл Во всех объявлениях типы одних и тех функций, классов и т. д. должны быть согласованы. Обычно, для достижения согласованности объявлений в различных единицах трансляции, используются заголовочные файлы (h– файлы), которые включаются в файлы проекта с помощью директивы препроцессора #include. В книге Стауструп Б. Язык программирования C++ приведено негласное практическое правило, указывающее какие инструкции следует включать в заголовочные файлы. Процитируем это правило. Негласное практическое правило гласит, что заголовочный файл может содержать: именованные пространства имен (namespace N{/* */}), определения типов (struct Point {int x, y;};), объявления шаблонов (template class Z;), объявления функций (extern int strlen(const char*);), определения встроенных функций (inline char get(char* p) {return *p++;}), объявления данных (extern int a;), определения констант (const float pi=3.1415;), перечисления (enum Light {red, yellow, green};), объявления имен (class Matrix;), директивы включения (#include ), макроопределения (#define VERSION 12), директивы условной компиляции (#ifdef cplusplus), комментарии (/* */).

Это практическое правило не является требованием языка. С другой стороны, заголовочный файл никогда не должен содержать: определения обычных функций (char get(char* p){return *p++;}), определения данных (int a;), определения агрегатов (short tbl[]={1,2,3};), неименованные пространства имен (namespace {/* */}), экспортируемые определения шаблонов (export template f(T t){/*.*/}).

Области действия идентификаторов Область действия идентификатора (диапазон доступа, область видимости) определяет, в каких частях программы этот идентификатор является доступным. Так, переменную, определенную в функции, можно использовать только в этой функции. Если же переменная определена до определений функций (в том числе и до функции main()), то е можно использовать во всех функциях данного файла.

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

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

Переменную, объявленную в начале программы, прежде определений функций (но необязательно до объявлений функций – прототипов) называют глобальной переменной, поскольку она известна во всем файле.

Имя должно быть уникальным в пределах своей области действия, т.е.

не должно быть конфликта имен. Однако в различных областях действия могут быть объявлены переменные с одинаковыми именами. Если же объявить переменную с именем, совпадающим с именем глобальной переменной, – что допустимо, – то локальная переменная перекроет глобальную. Операция глобальной области действия (или оператор глобального разрешения) :: позволяет обращаться к глобальной переменной из вложенной области действия.

Пример. В программе три различных переменных с именем m – глобальная переменная и две локальных переменных, одна из которых доступна только в цикле for. С помощью операции :: выполнено обращение к глобальной переменной m. Для глобальной константы pi применять оператор глобального разрешения не обязательно – это имя уникально в пределах всей программы. В цикле for нельзя получить доступ к другой переменной m, объявленной в main(), но с помощью операции :: можно работать с глобальной переменной m.

#include "stdafx.h" #include using namespace std;

// глобальные переменные const double pi=3.141592;

int m=2012;

int _tmain(int argc, _TCHAR* argv[]) { int n=0, m=1; // видимость только в main() for (int m=0;m<3;m++) // m видна только в for { n+=m;

cout<<"\n (for) m="< using namespace std;

//Глобальные переменные:

Pages:     | 1 |   ...   | 7 | 8 || 10 | 11 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.