This:
int proto_matrix[2 * dimension];
is a Variable Length Array (VLA), which is not Standard C++, but is supported by some compiler extensions. If compile with g++ -pedantic main.cpp, you will surely get an error.
That means that you need to dynamically allocate your memory, if you had to use an array.
You really don't though, C++ offers std::vector, which can achieve what you want relatively easily. I say relatively, because you have two matrices in one file, which makes parsing the file a bit tricky. Usually we put the one matrix in one file, and the other matrix to another file.
- A 2D array can be represented as a 2D vector.
- You want two matrices, thus two 2D vectors.
For that reason, I will use an array of size 2 (fixed size!), where every element is going to be a 2D vector.
Moreover, I will keep track of which matrix I am reading from the file right now (the first or the second), and how many rows I have read currently, in order to populate the correct cell of the matrix.
index is going to be equal to 0 or 1, to index the array.
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;
int main()
{
    int i = 0, j, k = 0, n, dimension;
    cout << "Enter the dimension of square matrices (3 by 3 would be 3) \n";
    cin >> n;
    dimension = n * n;
    vector< vector<int> > v[2];
    v[0].resize(n);
    v[1].resize(n);
    // make array of two matrices combined, this will be split into two matrices
    ifstream matrix_file("matrices.txt");
    string line;
    int rows_read = 0, cols_read = 0, index = 0;
    while (std::getline(matrix_file, line))
    {
        std::istringstream iss(line);
        int a, b, c;
        if (!(iss >> a >> b >> c)) { break; } // error
        // process tuple (a, b, c)
        if(index == 0 && rows_read >= n)
        {
            rows_read = 0;
            index = 1;
        }
        //cout<<"rows = " << rows_read << " " << index<<endl;
        v[index][rows_read].push_back(a);
        v[index][rows_read].push_back(b);
        v[index][rows_read++].push_back(c);
    }
    matrix_file.close();
    for(int i = 0; i < 2; ++i)
    {
        cout << "Printing matrix " << i << endl;
        for(auto& matrix: v[i])
        {
            for(auto& number: matrix)
                cout << number << " ";
            cout << endl;
        }
    }
    return 0;
}
Output:
Printing matrix 0
1 2 3 
4 5 6 
7 8 9 
Printing matrix 1
1 2 3 
4 5 6 
7 8 9 
PS: Unrelated to your problem, but What should main() return in C and C++? An int.