Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <string>
- #include <fstream>
- #include <map>
- #include <vector>
- using namespace std;
- typedef map <string, void*> row;
- typedef map <string, void*> :: iterator itRow;
- typedef map <string, string> Header;
- typedef map <string, string> :: iterator itHeader;
- struct DBTable {
- string tableName; // имя таблицы
- Header hdr; // заголовок таблиц (шапка)
- vector <row> data;// вектор из строк (записей) таблицы
- row& operator[](int index);
- };
- row& DBTable::operator[](int index)
- {
- return data[index];
- }
- map <string, DBTable> tab;
- string TableName="Student";
- int GetTypeCode(string colName) {
- string mass[4]={"NoType", "int1", "double1", "string1"};
- for (int i=0; i<4; i++) {
- if (mass[i]==colName) {
- return i;
- }
- }
- return 0;
- }
- void* GetValue (string colName, char *value)
- {
- void* val = NULL;
- switch (GetTypeCode(colName)) {
- case 0:
- val = NULL;
- break;
- case 1:
- {
- int *a = new int (atoi(value));
- val = a;
- break;
- }
- case 2:
- {
- double *a = new double (atof(value));
- val = a;
- break;
- }
- case 3:
- {
- char *buffer = new char[strlen(value)+1];
- memcpy(buffer, value, strlen(value)+1);
- val = buffer;
- break;
- }
- }
- return val;
- }
- void printValue(DBTable tab, string colName, size_t numRow)
- {
- switch (GetTypeCode(tab.hdr[colName]) ) {
- case 1:
- cout << *((int*)tab[numRow][colName]);
- break;
- case 2:
- cout << *((double*)tab[numRow][colName]);
- break;
- case 3:
- cout << (char*)(tab[numRow][colName]);
- break;
- }
- }
- DBTable readTable (DBTable tab) {
- ifstream fin;
- fin.open("Student.txt"); // Открытие файла для чтения
- // map <string, string> Students;
- vector <string> header;
- char line [500];// тут храним саму считанную из файла строку
- char* buf=line; // указатель на следующее слово
- char* token; // указатель для хранения слова строки
- fin.getline (buf, 500);
- while (token=strtok_s(buf,"|",&buf)) {
- header.push_back(token);
- }
- for (unsigned int i=0; i<header.size(); i+=2) {
- tab.hdr[header[i]]=header[i+1];
- }
- typedef map <string, void*> Row;
- while (fin.getline(line,500)) {
- buf = line;
- Row row;
- int i = 0;
- while (token = strtok_s(buf,"|",&buf))
- {
- row[header[i]] = GetValue(header[i+1], token);
- i+=2;
- }
- tab.data.push_back(row);
- }
- ofstream fo("StudentNewFormat.txt");
- /*
- char line [500];// тут храним саму считанную из файла строку
- char* buf; // указатель на следующее слово
- char* token; // указатель для хранения слова строки
- // Students.insert (pair <string, string> ("Петров Олег", "ИУ6-23"));
- // cout << Students.first << ": " << Students.second << endl;
- if (fin.fail()){
- cout<<"Ошибка открытия файла Student.txt\n";
- system("pause");
- return ;}
- while (fin.getline(line, 500, '\n')){
- buf = line;
- token = strtok_s (buf, "|", &buf);
- pair <string, string> p;
- p.first=token;
- p.second=buf;
- Students.insert (p);
- }
- for (auto it = Students.begin(); it != Students.end(); ++it) {
- fo << it->first << ": " << it->second << endl;
- }
- */
- fin.close();
- fo.close();
- return tab;
- }
- int main(){
- system("chcp 1251 > nul");
- tab[TableName] = readTable (tab[TableName]);
- for (itHeader i = tab[TableName].hdr.begin(); i != tab[TableName].hdr.end(); i++)
- {
- cout << setw(15) << i->first << setw(15) << i->second;
- }
- cout << endl;
- for (size_t i = 0; i < tab[TableName].data.size(); ++i)
- {
- cout << i+1;
- for (itRow cell = tab[TableName][i].begin(); cell != tab[TableName][i].end(); ++cell)
- {
- cout << "\t";
- printValue(tab[TableName], cell->first, i);
- }
- cout << endl;
- }
- // for (itHeader i = tab[TableName].data.begin(); i != tab[TableName].data.end(); i++) {
- // cout << setw(15) << i->first << setw(15) << i->second << "\n";
- // }
- // FILE *fl1; // Описание указателя – дескриптора файла
- /* struct Student {
- string imfamil;
- string group;
- };
- */
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement