Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
прога.docx
Скачиваний:
7
Добавлен:
16.04.2019
Размер:
149.14 Кб
Скачать

Ifstream f; // объявление потока для чтения

f.open("D:\\abc5.txt"); // режим ios::in

if (f) { cout << "Read file ! \n";

f >> nrow; f >> ncol;// Выделение памяти под массив

a = new int *[nrow]; for(i = 0;i < nrow;i++)

a[i]= new int [ncol]; // Заполнение массива

for(i = 0;i < nrow;i++) for(j = 0;j < ncol;j++)

f >> a[i][j];

cout << "\n"; f.close();

44. Понятие массива. Как организуется запись двумерного массива в бинарный файл и чтение

двумерного массива из бинарного файла? Пример

Запись элементов двумерного массива в бинарный файл

#include <conio.h>

#include <iostream>

#include <stdio.h>

using namespace std;

void main(void)

{ int nrow, ncol; int i,j; int **a; FILE *f;

cout << " nrow = "; cin >> nrow;

cout << " ncol = "; cin >> ncol; cout << "\n";

// Выделение памяти под массив

a = new int *[nrow];

for(i = 0;i < nrow;i++) a[i]= new int [ncol];

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

for(j = 0;j < ncol;j++) cin >> a[i][j];

f = fopen("D:\\abc7.dat","wb");

fwrite(&nrow,sizeof(int),1,f);

fwrite(&ncol,sizeof(int),1,f);

fwrite(a,sizeof(int),nrow*ncol, f);

cout << "\nFile write! \n"; fclose(f);

Чтение элементов двумерного массива из бинарного файла

int **b; int n,m;

f = fopen("D:\\abc7.dat", "rb");

if (f) { cout << "\nRead file ! \n\n";

fread(&n,sizeof(int),1,f);

fread(&m,sizeof(int),1,f); // Выделение памяти под массив

b = new int *[n]; for(i = 0;i < n;i++)

b[i]= new int [m]; fread(b,sizeof(int),n*m, f);

cout << "n = " << n << " " << "m = " << m << "\n\n";

for (i = 0;i < n;i++) { for (j = 0;j < m;j++)

cout << " " << b[i][j] << " "; cout << "\n"; }

} else cout << "File not found \n"; fclose(f);getch(); }

45. Понятие строки в языке С (С++). Синтаксис и примеры определения и инициализации строк.

В С++ есть два вида строк: С-строки и класс стандартной библиотеки С++ string.

С-cтрока – это массив символов, заканчивающийся нуль-символом (символом с кодом 0, что записывается в виде управляющей последовательности '\0'). Класс string более безопасен в использовании, чем С-строки, но и более ресурсоемок. Для грамотного использования этого класса требуется знание объектно-ориентированного программирования, поэтому он будет рассмотрен позднее, а пока рассмотрим С-строки.

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

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

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

Примеры определения и инициализации строк:

  1. char s1[]={'s','t','r','i','n','g','1','\0'}; //выделено и заполнено 8 байт

  1. char s2[] = "string2"; //выделено и заполнено 8 байт

  1. char s3[10] = "string3"; //выделено 10 байт, а заполнено 8 байт

  1. char *s4 = "string4"; //выделено и заполнено 8 байт

  2. char *s5 = new char [11];

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

s5[i]= ' ';

s5[10]='\0';

46. Понятие строки в языке С (С++). Способы ввода-вывода строк. Примеры

Вводить и выводить строки можно различными способами.

Можно вводить строки с помощью объекта cin и операции ввода >>.

Как видно из примера, при вводе строки, состоящей из нескольких слов, выводится только первое слово. Это происходит из-за того, что ввод выполняется до первого пробельного символа (пробела, знака табуляции или символа перевода строки \n).

Если во вводимой строке больше символов, чем может вместить выделенная для ее хранения область памяти, то программа завершиться аварийно. Использование манипулятора setw(80) позволяет избежать переполнение буфера, отведенного под строку, поскольку ограничивает количество вводимых символов числом в скобках.

47. Понятие строки в языке С (С++). Основные библиотечные функции для обработки строк,

примеры их использования

Если требуется ввести строку, состоящую из нескольких слов, в одну строковую переменную, используются методы getline или get класса istream, объектом которого является cin. Позже мы изучим, что такое класс и его методы, а пока просто будем пользоваться ими. Здесь важно знать синтаксис вызова метода – после имени объекта ставиться точка, а затем записывается имя метода.

Метод getline считывает из входного потока (n-1) символов или менее, если символ перевода строки встретился раньше, и записывает их в строковую переменную s. Символ перевода строки также считывается (удаляется) из входного потока. Вместо символа перевода строки в строковой переменной размещается завершающий 0.

Метод get работает аналогично, но оставляет в потоке символ перевода строки. В строковую переменную добавляется завершающий 0.

Замечание. Типичная ошибка: нельзя обращаться к методу get с двумя аргументами два раза подряд, не удалив ‘\n’ из входного потока.

После ввода первой строки метод get «встретит» символ ‘\n’ , оставленный во входном потоке после первого вызова этого метода. В результате на экран будут выведены еще три пустые строки, а символ ‘\n’ так и останется во входном потоке. Это символ надо удалить из потока путем вызова get без параметров.

Метод getline после прочтения строки не оставляет во входном потоке символ ‘\n’ , поэтому лучше пользоваться им.

48. Как в С(С++) организуется построчная обработка текстовых файлов? Примеры

Для построчной обработки текстовых файлов используют функции fgets() и fputs() .

Функция fgets() считывает строку из size символов из потока stream, связанного с текстовым файлом, в строковую переменную s;

Функция fputs() записывает строку s в поток stream, связанный с текстовым файлом;

Функция fgetc () считывает символ из файла, открытого функцией fopen() в режиме чтения. Параметр stream является указателем на поток, возвращенным функцией fopen(). Функция fgetc() возвращает целочисленную переменную, младший байт которой содержит введенный символ. Если возникла ошибка, старший байт этой переменной равен нулю. Если при чтении обнаруживается конец файла, функция fgetc() возвращает константу EOF.

Функция fputc() записывает символ в файл, открытый с помощью функции fopen(). Параметр stream представляет собой указатель файла, возвращенный функцией fopen(), а аргумент является символом, подлежащим выводу. Указатель stream сообщает функции putc(), в какой именно файл следует произвести запись. Несмотря на то, что параметр имеет тип int, в файл записывается лишь младший байт. Если функция fputc() выполнена успешно, она возвращает символ, записанный ею в файл. В противном случае она возвращает константу EOF.

Основные библиотечные функции для обработки строк в стиле С ( объявлены в файле string.h).

-unsigned strlen(char* s)

-int *strcmp(char* s1, char* s2)

-char *strchr(char* s, int ch)

-char* strstr(char* s1 char* s2)

-char* strcpy(char* s1, char* s2)

-char* strcat(char* s1, char* s2)

-char* strtok(char* s1, char* s2)

Функции ввода - вывода для построчной обработки текстовых файлов:

char *fgets(char *s, int size, FILE *stream) int fputs(char *s, FILE *stream)

Примеры использования функций поиска из библиотеки обработки строк (string.h)

#include <iostream.h> #include <string.h> #include <conio.h> void main()

{ // использование strcspn и strspn

char *str1="The value is 3.14159";

char *str2="3.14159 is the value";char *str3="1234567890";

cout <<endl <<"str1 = "<< str1 <<" str3 = " <<str3 << endl; // длина начальной части строки str1, не // содержащая символов из str2, равна

cout << " - " << strcspn(str1,str3) << endl;

cout <<endl <<"str2 = "<< str2 <<" str3 = " <<str3 << endl;

// длина начальной части строки str1, содержащая только // символы из str2, равна

cout << " - " << strspn(str2,str3) << endl; getch();

49. Как в С(С++) организуется посимвольная обработка текстовых файлов? Примеры.

Функции fprintf() и fscanf() , fgetc() и fputc() используют для посимвольной обработки текстовых файлов.

Файловые функции ввода-вывода fprintf() и fscanf() работают аналогично функциям printf() и scanf(), но имеют дополнительный аргумент, являющийся указателем на файловый поток.

Функции ввода - вывода для посимвольной обработки текстовых файлов:

int fscanf (FILE *stream, форматная строка, список аргументов);

int fprintf (FILE *stream, форматная строка, список аргументов);

int fgetс(FILE *stream)

int fputс(char с, FILE *stream)

50. Понятие строки в языке С (С++). Как передаются строки в качестве параметра в функцию? Пример

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

Задача: составить функцию, которая переставляет символы строки в обратном порядке.

Алгоритм:

    • определить длину строки ;

    • все символы первой половины строки переставить с соответствующими символами второй

#include <conio.h>

#include <string>

using namespace std;

void Reverse ( char s[])

{ int len = strlen(s);

char c;

for ( int i = 0; i < len/2; i ++ )

{ c = s[i]; s[i] = s[len-i-1]; s[len-1-i] = c; }

}

int main()

{ char s[] = "0123456789";

Reverse(s); puts(s);

Reverse(s + 5); puts(s); // инверсия части строки

getch();

}