Чтение массива из файла в таблицу с++

274
30 января 2018, 10:35

Из файла нужно считать массив в таблицу, а затем производить манипуляции с этой таблицей:

  • добавление строк и столбцов в конец;
  • вставка строк и столбцов в указанное место;
  • удаление выбранной строки или столбца.

Вот пример файла, из которого нужно считать массив:

char* myvec5 [5][5] = {
        {"str00","str01","str02","str03","str04"},//sometext 
        {"str00","str01","str02","str03","str04"},
        {"str00","str01","str02","str03","str04"},
        {"str00","str01","str02", "str03","str04"},
        {"str00","str01","str02","str03","str04"}
    };

Файл может содержать различный код на с++. Ну, вот наработки кода:

#include<iostream>
#include<cstdlib>
#include<string>
#include<fstream>
#include<algorithm>
#include<iterator>
#include<sstream>
using namespace std;
string **row_add(string **arr, int &R, int C, int pos) {
    R++;
    string **new_arr = new string*[R];
    for (int i = 0; i < R; i++)
        new_arr[i] = new string[C];
    for (int i = 0, ti = 0; i < R; i++) {
        for (int j = 0; j < C; j++) 
            if (i == pos)
                new_arr[i][j] = "row";
            else
                new_arr[i][j] = arr[ti][j];
            if (i != pos) 
                ti++;
    }
    for (int i = 0; i < R - 1; i++)
        delete[] arr[i];
    delete[] arr;
    arr = NULL;
    return new_arr;
}
string **col_add(string **arr, int R, int &C, int pos) {
    C++;
    string **new_arr = new string*[R];
    for (int i = 0; i < R; i++)
        new_arr[i] = new string[C];
    for (int i = 0; i < R; i++) 
        for (int j = 0, tj = 0; j < C; j++) {
            if (j == pos)
                new_arr[i][j] = "col";
            else new_arr[i][j] = arr[i][tj];
            if (j != pos)
                tj++;
        }
    for (int i = 0; i < R; i++)
        delete[] arr[i];
    delete[] arr;
    arr = NULL;
    return new_arr;
}
string **col_delete(string **arr, int R, int &C, int pos) {
    for (int j = pos; j < C - 1; j++) {
        for (int i = 0; i < R; i++) {
            arr[i][j] = arr[i][j + 1];
        }
    }
    C--;
    return arr;
}
string **row_delete(string **arr, int &R, int C, int pos) {
    for (int i = pos; i < R - 1; i++) {
        for (int j = 0; j < C; j++) {
            arr[i][j] = arr[i + 1][j];
        }
    }
    R--;
    return arr;
}
int main() {
    string file;
    cout << "Enter a name of file: ";
    cin >> file;
    string filename = file + ".txt";
    ifstream fin;
    fin.open(filename);
    if (!fin) {
        cout << "Error reading file.\n";
        exit(1);
    }
    string line, line2;
    int row, col;
//  fin >> row >> col;
    fin >> line >> line2;
    replace_if(line.begin(), line.end(),
        [](const char& c) { return ((c == '[') || (c == ']')); },
        ' ');
    replace_if(line2.begin(), line2.end(),
        [](const char& c) { return ((c == '[') || (c == ']')); },
        ' ');
    row = atoi(line.c_str());
    col = atoi(line2.c_str());
    string **a = new string *[row];
    for (int i = 0; i < row; i++) {
        a[i] = new string[col];
    }
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
            fin >> a[i][j];
//          getline(fin, a[i][j]);
            replace_if(a[i][j].begin(), a[i][j].end(),
                [](const char& c) { return ((c == '{') || (c == ',') || (c == '}')); },
                ' ');
                auto it = std::remove_if(a[i][j].begin(), a[i][j].end(), [&](char c) { return c == '"'; });
                a[i][j] = std::string(a[i][j].begin(), it);
    //      getline(fin, a[i][j], ' ');
        //  fin.ignore();
            cout << a[i][j] << "\t ";
        }
        cout << endl;
    }
    char key;
    bool menu = true;
    while (menu) {
        cout << "***MENU***" << endl;
        cout << "1.Add column\n";
        cout << "2.Add row\n";
        cout << "3.Delete column\n";
        cout << "4.Delete row\n";
        cout << "5.Save results in file\n";
        cout << "0.Exit\n";
        cout << "Choose your action. Type a command: \n";
        cin >> key;
        switch (key) {
        case '1': 
            int colpos;
            cout << "\nEnter the number of column to insert: \n";
            cin >> colpos;
            a = col_add(a, row, col, colpos);
            cout << "\nNew array: \n";
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    cout << a[i][j] << "\t ";
                } 
                cout << endl;
            }
            break;
        case '2':
            int rowpos;
            cout << "\nEnter the number of row to insert: \n";
            cin >> rowpos;
            a = row_add(a, row, col, rowpos);
            cout << "\nNew array: \n";
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    cout << a[i][j] << "\t ";
                }
                cout << endl;
            }
            break;
        case '3':
            int NumberDeleteCol;
            cout << "\nEnter the number of the column to remove: \n";
            cin >> NumberDeleteCol;
            a = col_delete(a, row, col, NumberDeleteCol);
            cout << "\nNew array: \n";
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    cout << a[i][j] << "\t ";
                }
                cout << endl;
            }
            break;
        case '4':
            int NumberDeleteRow;
            cout << "\nEnter the number of the row to delete: \n";
            cin >> NumberDeleteRow;
            a = row_delete(a, row, col, NumberDeleteRow);
            cout << "\nNew array: \n";
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    cout << a[i][j] << "\t ";
                }
                cout << endl;
            }
            break;
        case '5':
        {
            ofstream ofout;
            ofout.open(filename);
            ofout << row << " " << col << "\n";
            for (int i = 0; i < row; i++) {
                for (int j = 0; j < col; j++) {
                    ofout << a[i][j] << " ";
                }
                ofout << endl;
            }
            ofout.close();
            break;
        }
        case '0':
            exit(0);
            break;
        default:
            cout << "You entered wrong command! Please, try another: \n";
            break;
        }
    }
    system("pause");
    return 0;
}
READ ALSO
Не могу открыть Db файл в Qt C++

Не могу открыть Db файл в Qt C++

Вот код для подключения Sql Lite файла но не может открыть Db файл в правильном директории

193
не работает тест Cmake&#39;а в CLion

не работает тест Cmake'а в CLion

Здравствуйтедве недели назад столкнулся с проблемой и никак не могу ее решить

231
Ошибка тестирования диалогового окна

Ошибка тестирования диалогового окна

Пишет вот такую ошибку

220