class List
{
private:
char** arr;
public:
List(){ next = prev = NULL; }
~List(){};
void set(char** Arr){ arr = Arr; }
char** get(){ return arr; }
List* next;
List* prev;
}*head,*tail;
void Add(char** Arr);
void out();
int main()
{
FILE* myfile = NULL;
errno_t err = fopen_s(&myfile, "file.cvs", "r");
char line[100];
char seps[] = " ,tn";
char *token = NULL;
char *next_token = NULL;
char** arr = NULL;
if (!err)
{
while (!feof(myfile))
{
fgets(line, 100, myfile);
token = strtok_s(line, seps, &next_token);
arr = new char*[3];
int idx = 0;
while ((token != NULL))
{
if (token != NULL)
{
arr[idx] = new char[100];
strcpy_s(arr[idx], strlen(token) + 1, token);
//printf(" %sn", token);
token = strtok_s(NULL, seps, &next_token);
idx++;
}
}
Add(arr);
}
out();
}
fclose(myfile);
cout << endl;
system("pause");
return 0;
}
void Add(char** Arr)
{
List* ptr = NULL, *tmp = NULL;
if (head == NULL)
{
ptr = new List();
ptr->set(Arr);
ptr->next = ptr->prev = NULL;
head = tail = ptr;
}
else
{
tmp = tail;
ptr = new List();
ptr->set(Arr);
tmp->next = ptr;
ptr->prev = tmp;
tail = ptr;
ptr->next = NULL;
}
}
void out()
{
List* ptr = NULL;
for (int idx = 0; idx < 3; idx++)
{
ptr = head;
while (ptr != NULL)
{
cout << ptr->get()[idx] << " ";
ptr = ptr->next;
}
cout << endl;
}
}
Что означает каждая строка?
Помогите плиз. Закомментируйте каждую строку, что из них каждая означает? Чтоб я, чайник, понял)))
Код:
#include <string.h>
#include <stdio.h>
#include <iostream>
using namespace std;
//класс Лист(двусвязный список)
class List
{
private:
//указатель на двумерный массив типа чар
char** arr;
public:
//контсруктор
List(){ next = prev = NULL; }
//деструктор
~List(){};
//метод(функция), которая задает значения переменной(указателя) arr
void set(char** Arr){ arr = Arr; }
//функция, которая возращает указатель arr
char** get(){ return arr; }
//указаетль типа лист на следующий элемент списка
List* next;
//указатель типа лист на предудущий элемент списка
List* prev;
}*head,*tail;//указетль на начало(head) и конец списка(tail)
//объявляем функцию Add
void Add(char** Arr);
//объявляем фунцкию out
void out();
//главная функция
int main()
{
//указатель на файловый указаетель, который получит указатель на открытый файл
FILE* myfile = NULL;
//открываем файл в режиме чтения, errno_t если файл открывает возращает 0, нет - код ошибки
errno_t err = fopen_s(&myfile, "file.cvs", "r");
//переменная типа чар размером 100 символов
char line[100];
//массив сепараторов(разделителей, по которым будем парсить строку на столбцы)
char seps[] = " ,\t\n";
//указатель на токен(последовательность символов), в котором будем хранить символы разделенные сепаратором
char *token1 = NULL;
//указатель на токен, в котором будем хранить оставшиеся символы строки
char *next_token1 = NULL;
//указаетль на двумерный массив типа чар
char** arr = NULL;
//если файл открыт
if (!err)
{
//пока не конец файла
while (!feof(myfile))
{
//читаем строку в переменную line 100 символов из файла
fgets(line, 100, myfile);
//находим токен в строке с помощью сепараторов
token1 = strtok_s(line, seps, &next_token1);
//выделяем память под двумерный массив на 3 указателя типа чар
arr = new char*[3];
//переменная для счетчика
int idx = 0;
//пока есть выделенные токены из строки, ищим их
while ((token1 != NULL))
{
//если есть токен в строке
if (token1 != NULL)
{
//выделяем память под массив типа чар на 100 символов
arr[idx] = new char[100];
//копируют строку token1 в массив
strcpy_s(arr[idx],strlen(token1)+1,token1);
//printf(" %sn", token1);
//находим токен в строке с помощью сепараторов
token1 = strtok_s(NULL, seps, &next_token1);
//увеличиваем счетчик на 1
idx++;
}
}
//вызываем функцию Add, в которую передаем указаетель на двумерный массив
Add(arr);
}
//вызываем функцию out
out();
}
//закрываем файл
fclose(myfile);
cout << endl;
//останавливаем консоль типа (getch())
system("pause");
return 0;
}
//функция добавляющая элемент в конец списка
void Add(char** Arr)
{
//ptr - указатель на класс List
//tmp - времменый указаетль на класс List
//инициализируем ptr и tmp нулями
List* ptr = NULL, *tmp = NULL;
//добавляем элемент в список
//если список пуст
if (head == NULL)
{
//выделяем память под 1 элемент списка
ptr = new List();
//заполняем массив полученными токенами в строке
ptr->set(Arr);
//указатели на следующий и предыдущий элемент отсутствуют
ptr->next = ptr->prev = NULL;
//единственный элемент списка есть начало и конец списка
head = tail = ptr;
}
//если в списке есть уже элементы
else
{
//запоминаем указатель на последний элемент списка
tmp = tail;
//выделяем память под 1 элемент списка
ptr = new List();
//заполняем массив полученными токенами в строке
ptr->set(Arr);
//связываем предыдущий элемент с новым
tmp->next = ptr;
//связываем новый элемент с предыдущим
ptr->prev = tmp;
//последний элемент списка делаем новый элемент
tail = ptr;
//новый элемент не имеет следующего так как он последний в списке
ptr->next = NULL;
}
}
//функция, выводящая спика по заданому условию
void out()
{
List* ptr = NULL;
//ptr - указатель на класс List
//проходим по массивам каждого элемента списка
for (int idx = 0; idx < 3; idx++)
{
//указателю типа Лист присваем указатель на первый элемент списка
ptr = head;
//пока в списке не последний элемент
while (ptr->next != NULL)
{
//выводим значения токенов из элемента списка, по заданному условию
cout << ptr->get()[idx] << " ";
//переходим не следующий элемент списка
ptr = ptr->next;
}
cout << endl;
}
}
#include <stdio.h>
#include <iostream>
using namespace std;
//класс Лист(двусвязный список)
class List
{
private:
//указатель на двумерный массив типа чар
char** arr;
public:
//контсруктор
List(){ next = prev = NULL; }
//деструктор
~List(){};
//метод(функция), которая задает значения переменной(указателя) arr
void set(char** Arr){ arr = Arr; }
//функция, которая возращает указатель arr
char** get(){ return arr; }
//указаетль типа лист на следующий элемент списка
List* next;
//указатель типа лист на предудущий элемент списка
List* prev;
}*head,*tail;//указетль на начало(head) и конец списка(tail)
//объявляем функцию Add
void Add(char** Arr);
//объявляем фунцкию out
void out();
//главная функция
int main()
{
//указатель на файловый указаетель, который получит указатель на открытый файл
FILE* myfile = NULL;
//открываем файл в режиме чтения, errno_t если файл открывает возращает 0, нет - код ошибки
errno_t err = fopen_s(&myfile, "file.cvs", "r");
//переменная типа чар размером 100 символов
char line[100];
//массив сепараторов(разделителей, по которым будем парсить строку на столбцы)
char seps[] = " ,\t\n";
//указатель на токен(последовательность символов), в котором будем хранить символы разделенные сепаратором
char *token1 = NULL;
//указатель на токен, в котором будем хранить оставшиеся символы строки
char *next_token1 = NULL;
//указаетль на двумерный массив типа чар
char** arr = NULL;
//если файл открыт
if (!err)
{
//пока не конец файла
while (!feof(myfile))
{
//читаем строку в переменную line 100 символов из файла
fgets(line, 100, myfile);
//находим токен в строке с помощью сепараторов
token1 = strtok_s(line, seps, &next_token1);
//выделяем память под двумерный массив на 3 указателя типа чар
arr = new char*[3];
//переменная для счетчика
int idx = 0;
//пока есть выделенные токены из строки, ищим их
while ((token1 != NULL))
{
//если есть токен в строке
if (token1 != NULL)
{
//выделяем память под массив типа чар на 100 символов
arr[idx] = new char[100];
//копируют строку token1 в массив
strcpy_s(arr[idx],strlen(token1)+1,token1);
//printf(" %sn", token1);
//находим токен в строке с помощью сепараторов
token1 = strtok_s(NULL, seps, &next_token1);
//увеличиваем счетчик на 1
idx++;
}
}
//вызываем функцию Add, в которую передаем указаетель на двумерный массив
Add(arr);
}
//вызываем функцию out
out();
}
//закрываем файл
fclose(myfile);
cout << endl;
//останавливаем консоль типа (getch())
system("pause");
return 0;
}
//функция добавляющая элемент в конец списка
void Add(char** Arr)
{
//ptr - указатель на класс List
//tmp - времменый указаетль на класс List
//инициализируем ptr и tmp нулями
List* ptr = NULL, *tmp = NULL;
//добавляем элемент в список
//если список пуст
if (head == NULL)
{
//выделяем память под 1 элемент списка
ptr = new List();
//заполняем массив полученными токенами в строке
ptr->set(Arr);
//указатели на следующий и предыдущий элемент отсутствуют
ptr->next = ptr->prev = NULL;
//единственный элемент списка есть начало и конец списка
head = tail = ptr;
}
//если в списке есть уже элементы
else
{
//запоминаем указатель на последний элемент списка
tmp = tail;
//выделяем память под 1 элемент списка
ptr = new List();
//заполняем массив полученными токенами в строке
ptr->set(Arr);
//связываем предыдущий элемент с новым
tmp->next = ptr;
//связываем новый элемент с предыдущим
ptr->prev = tmp;
//последний элемент списка делаем новый элемент
tail = ptr;
//новый элемент не имеет следующего так как он последний в списке
ptr->next = NULL;
}
}
//функция, выводящая спика по заданому условию
void out()
{
List* ptr = NULL;
//ptr - указатель на класс List
//проходим по массивам каждого элемента списка
for (int idx = 0; idx < 3; idx++)
{
//указателю типа Лист присваем указатель на первый элемент списка
ptr = head;
//пока в списке не последний элемент
while (ptr->next != NULL)
{
//выводим значения токенов из элемента списка, по заданному условию
cout << ptr->get()[idx] << " ";
//переходим не следующий элемент списка
ptr = ptr->next;
}
cout << endl;
}
}
Спасибо огромное!))) Рад, что есть такие люди!!