Чтение элементов двумерного массива из бинарного файла
int **b; intn,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. chars1[]={'s','t','r','i','n','g','1','\0'}; //выделено и заполнено 8 байт
2. chars2[] = "string2"; //выделено и заполнено 8 байт
3. chars3[10] = "string3"; //выделено 10 байт, а заполнено 8 байт
4. char *s4 = "string4"; //выделено и заполнено 8 байт
5. char *s5 =new char [11];
for (inti=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).
-unsignedstrlen(char* s)
-int*strcmp(char* s1, char* s2)
-char*strchr(char* s, intch)
-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)intfputs(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(), но имеют дополнительный аргумент, являющийся указателем на файловый поток.
Функции ввода - вывода для посимвольной обработки текстовых файлов:
intfscanf (FILE *stream, форматная строка, список аргументов);
intfprintf (FILE *stream, форматная строка, список аргументов);
intfgetс(FILE *stream)
intfputс(char с, FILE *stream)
50. Понятие строки в языке С (С++). Как передаются строки в качестве параметра в функцию? Пример
Строки передаются в функции также, как и массивы.