Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wczytywanie punktów 3D z pliku CSV

Ostatnio zmodyfikowano 2017-12-30 19:14
Autor Wiadomość
Qwertyluk
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie punktów 3D z pliku CSV
» 2017-12-30 17:23:10
Witam wszystkich, mój problem polega na wczytaniu punktów 3D z pliku CSV.
Punkty mam zapisane w prosty sposób, np:
0,34;0,24;0,78  <- pierwszy punkt
0,24;0,12;0,87  <-drugi punkt
0,25;0,90;0,12  <-trzeci punkt
itd.

Dane te chciałbym wczytać za pomocą strumienia.
Zaczynam wiec od liczenia linijek (ponieważ tyle ile linijek, to tyle posiadam punktów do wczytania) i tutaj się już zaczyna coś dziwnego, a mianowicie zawsze jest jedna dodatkowa linijka pusta. Nie mam pojęcia od czego się bierze.
No, ale kij z tym, bo po prostu sobie robię dynamiczna tablice o wymiarach [ilosc linijek - 1].
No i zaczynam zabawe czyli wczytywanie danych. No i kij bombki strzelił. Nie wczytuje.. Dlaczego? Nie wiem.
Ale po kilku godzinach różnych prób zorientowałem się, że gdybym wczytywał dane bez ostatniej pustej linijki to dane się normalnie wczytują..
Jak to obejść? Muszę sprawdzić ostatni znak pliku i jeżeli istnieje pusta linijka to muszę ją usuwać, czy jest jakiś inny sposób?

Oto mój kod:

C/C++
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

struct point_t
{
    double x, y, z;
};

int main()
{
    fstream plik;
    plik.open( "plik1.csv", std::ios::in );
    if( plik.good() == true )
    {
        cout << "Uzyskano dostep do pliku!\n";
    }
    else
    {
        cout << "Blad dostepu do pliku!\n";
    }
   
   
    plik.seekg( 0 );
    string line;
    int number_of_lines = 0;
    while( !plik.eof() )
    {
        getline( plik, line );
        number_of_lines++;
    }
   
    point_t * tablica;
    tablica = new point_t[ number_of_lines - 1 ];
    plik.seekg( 0 );
    for( int i = 0; i < number_of_lines - 1; i++ )
    {
        plik >> tablica[ i ].x;
        plik.seekg( 1, ios::cur );
        plik >> tablica[ i ].y;
        plik.seekg( 1, ios::cur );
        plik >> tablica[ i ].z;
    }
   
    for( int i = 0; i < number_of_lines - 1; i++ )
    {
        cout << tablica[ i ].x << " " << tablica[ i ].y << " " << tablica[ i ].z << endl;
    }
    system( "pause" );
}
P-168245
mateczek
» 2017-12-30 18:09:15
zobacz taki kod
Domyślnie zmienne typu doube podaje się po kropce nie po przecinku np: 12.4;
C/C++
#include <fstream>
#include <iostream>
#include<vector>
using namespace std;
struct point_t {
    double x, y, z;
};

int main() {
    fstream plik( "C.txt", std::ios::in );
    if( !plik ) {
        cout << "Blad dostepu do pliku!\n";
        return 0;
    }
    cout << "Uzyskano dostep do pliku!\n";
    point_t p; char chr; //zmienne tymczasowe
   
    vector < point_t > tablica; //tablica na odczytane punkty
    while( plik >> p.x >> chr >> p.y >> chr >> p.z ) {
        tablica.push_back( p ); //dodanie punktu do tablicy gdy wczytanie się powiodło
    }
    for( size_t i = 0; i < tablica.size(); i++ ) {
        cout << tablica[ i ].x << " " << tablica[ i ].y << " " << tablica[ i ].z << endl;
    }
}
P-168247
mokrowski
» 2017-12-30 19:14:50
Trochę się uparłeś na ten separator przecinka. Ale oczywiście i to da się przestawić.
C/C++
#include <iostream>
#include <fstream>
#include <vector>
#include <iomanip>
#include <cstdlib>

using point_t = struct {
    double x;
    double y;
    double z;
};

struct comma
    : std::numpunct < char >
{
    char do_decimal_point() const {
        return ',';
    }
};

std::vector < point_t > read_points( std::ifstream & file ) {
    std::vector < point_t > data;
    file.imbue( std::locale( file.getloc(), new comma ) );
    point_t point;
    char c;
   
    while( file >> point.x >> c >> point.y >> c >> point.z ) {
        data.push_back( point );
    }
    return data;
}

void show_points( const std::vector < point_t >& data ) {
    for( const auto & pt: data ) {
        std::cout << "Point: x = " << std::setw( 5 ) << std::right << pt.x
        << "\ty = " << std::setw( 5 ) << std::right << pt.y
        << "\tz = " << pt.z << '\n';
    }
}

int main() {
    std::vector < point_t > points;
    {
        std::ifstream file { "plik1.csv" };
        if( !file ) {
            std::cerr << "Problem z uzyskaniem dostępu do pliku danych.\n";
            return EXIT_FAILURE;
        }
        points = read_points( file );
    }
    show_points( points );
   
    return EXIT_SUCCESS;
}
P-168250
« 1 »
  Strona 1 z 1