C++ wczytywanie pliku CSV

0

Cześć, od dłuższego czasu męczę się z prostym zadaniem, a mianowicie, wczytywaniem i zapisywaniem danych do pliku csv. Próbowałem własnymi siłami to zrobić, ale nie udało mi się, więc spróbowałem pomóc sobie internetem. W internecie znalazłem następujący kod:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>

using namespace std;

struct Matrix
{
    int k, w;
    float **M;
};

Matrix ReadCSV(string fileName)
{

	vector<vector<string>> content;
	vector<string> row;
	string line, word;

	fstream file (fileName, ios::in);
	if(file.is_open())
	{
		while(getline(file, line))
		{
			row.clear();

			stringstream str(line);

			while(getline(str, word, ','))
				row.push_back(word);
			content.push_back(row);
		}
	}
	else
		cout<<"Could not open the file\n";

	for(int i=0;i<content.size();i++)
	{
		for(int j=0;j<content[i].size();j++)
		{
			cout<<content[i][j]<<" ";
		}
		cout<<"\n";
	}
}

int main()
{
    ReadCSV("a.csv");
    return 0;
}

Jednak to również nie rozwiązało mojego problemu. Program zwraca komunikat "Could not open the file"
Proszę o pomoc, już któryś dzień siedzę nad tym problemem

0

Czy plik, który próbujesz otworzyć, nazywa się a.csv i znajduje się w folderze, w którym szuka go Twoja aplikacja? Spróbuj zastąpić to ścieżką bezwzględną, mniej rzeczy może pójść nie tak…

0

To już sprawdzałem, plik znajduje się w katalogu wraz z plikiem exe, nazwa jest poprawna :(

To masz źle skonfigurowane IDE, a program nie jest wykonywany z folderu w którym jest plik wykonywalny. Bo kod zasadniczo działa, jeśli pominiemy fakt, że funkcja Matrix ReadCSV(string fileName) nie zwraca niczego, a już w szczególności Matrixa.

1

Gdy poawia sie taki błąd najpeije skorzystać std::perror i odczytać na strumieniu błędów w czy problem.

3
adrian95 napisał(a):

Cześć ... W internecie znalazłem następujący kod:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>


struct Matrix
{
    int k, w;
    float **M;
};

Mam złą wiadomość.

Do kopiowania z internetu trzeba wyższych kwalifikacji, niż do pisania samodzielnie.
Autor tej struktury coś czuł, że mu podwójny pointer nie pasuje, ale że był znafcom C++ jakim był, napisał (albo ukradł) jak umiał. To typowy wzorzec, ale w C.

Można to napisać (wszystko przykłady szkolne dalekie od ideału)
a)

class Matrix {
   public:
     vector<vestor<float>> mat;
     int getXsize() const;
     int getYsize() const;

    float getValue(int x,y) const;
    void setValue(int x, int y, float v) ;

     // tak naprawdę to operator tablicowy, ale nie napiszę go bez IDE
          
}

https://blog.michalt.pl/article/wielowymiarowy-operator-tablicowy-w-c-23

b)

class Matrix {
private:
     vector<vestor<float>> mat;
   public:
     int getXsize() const;
     int getYsize() const;

    float getValue(int x,y) const;
    void setValue(int x, int y, float v) ;
}

c) a nawet bardziej "manualnie"

class Matrix {
private:
     float** mat;
     int k, w;
   public:
      Matrix(int, int);
     int getXsize() const;
     int getYsize() const;

    float getValue(int x,y) const;
    void setValue(int x, int y, float v) ;
}

Można na kilka spsoobów rozwiazać konstruktor Macierzy o nieznanym z góry rozmiarze ... wszystko można...

Tak, że uważajcie skąd kopiujecie (ty i twój kododawca), <sarkazm>patrzcie na to krytycznie</sarkazm>, i nade wszystko próbujcie sami, a nie kopiujcie

1 użytkowników online, w tym zalogowanych: 0, gości: 1