Loading a matrix from file

  • Thread starter BRN
  • Start date
  • #1
BRN
99
9
Hello everybody,
I created this tamplet to upload a file matrix:

Load Matrix:
#include <sstream>
#include "fstream"
#include <vector>
#include <iostream>
#include <string>

template<class T >std::istream& readMatrix(std::vector<std::vector<T>>& outputMatrix, std::istream& inStream)
{
    if (inStream) {
        std::string line;

        while (std::getline(inStream, line)) {
            outputMatrix.emplace_back();

            // Break down the row into column values
            std::stringstream split(line);
            int value;

            while (split >> value)
                outputMatrix.back().push_back(value);
        }
    }
    return inStream;
}

Unfortunately it does not provide me with the correct output. I get this:


Output:
input:
1234
5678 
9123
4567

output:
1234 0 0 0 
5678 0 0 0 
9123 0 0 0 
4567 0 0 0

I can't understand why I get those zeros. Any idea?
 

Answers and Replies

  • #2
14,193
8,181
Did you mean to write split > value or split >> value?

I don't understand where the split values are assigned.

It seems you've called a split(line) function which I assume returns an array of values.
 
  • #3
Ibix
Science Advisor
Insights Author
2022 Award
10,103
10,678
Your matrix file format is ambiguous unless you can absolutely guarantee that every entry will only ever be a single digit number. If one line is 12345 should that be 12,3,4,5 or 1,23,4,5 or 1,2,34,t or 1,2,3,45? You should put in delimiters such as spaces or commas.

I think what's happening is that you have told your stream to read values from each line in your input until it runs out of input. It reads the first value 1234, which is a valid four digit number, and finds nothing else on the line so goes on to the next line. You need to look at how std::stringstream's operator>> works with delimiters if you want to potentially use more than one digit, or consider using get() instead if you genuinely only want single digit numbers and no delimiters.
 
  • #4
Timo
401
46
The code looks fine to me. And when I run it, it works as expected: I created a file data.dat with the entries
1234
5678
9012
3456

and ran it with your code, extended by a main
Code:
int main() {
    using namespace std;
    ifstream file("data.dat");
    vector<vector<int>> matrix;
    readMatrix(matrix, file);
    for(const auto& row: matrix) {
        for (const auto& entry: row) {
            cout<<entry<<" ";
        }
        cout<<endl;
    }
}
When I run the program, I get exactly the expected 1x4 matrix that is in data.dat - no zeroes added. I suspect the problem is in your input stream, not in the code you use to parse it.
 
  • #5
Filip Larsen
Gold Member
1,628
554
The code looks fine to me.
The splitting looks fine to me too. And a similar example runs as it should.
 
  • #6
Timo
401
46
On 2nd though, here is another suspicion what goes wrong: Check the code where you output your matrix: Maybe your code assumes a 4x4 matrix and fills the missing entries with 0 or access to uninitialized memory locations like matrix[0][1]?
 
  • #7
BRN
99
9
Your matrix file format is ambiguous unless you can absolutely guarantee that every entry will only ever be a single digit number. If one line is 12345 should that be 12,3,4,5 or 1,23,4,5 or 1,2,34,t or 1,2,3,45? You should put in delimiters such as spaces or commas.
Exactly, this was the problem. I inserted a space between each matrix element in the file and is now loaded correctly.

Maybe your code assumes a 4x4 matrix and fills the missing entries with 0 or access to uninitialized memory locations like matrix[0][1]?
Yes, this happened. My code interpreted my file as a single column of 4 values and consequently added three other columns of zeros.

Thank you all for your answers!
 
  • Like
Likes jtbell, Filip Larsen and berkeman

Suggested for: Loading a matrix from file

Replies
8
Views
836
  • Last Post
Replies
8
Views
541
Replies
8
Views
325
Replies
6
Views
4K
Replies
9
Views
622
Replies
2
Views
473
  • Last Post
Replies
3
Views
639
Replies
14
Views
578
Replies
5
Views
721
  • Last Post
Replies
34
Views
2K
Top