Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41

    [C++] acquisire dati da file

    Scusate non sono sicuro di aver fatto un buon lavoro:

    nell'header "ohlc.h" dichiaro un nuovo tipo detto ohlc come segue

    codice:
    #IFNDEF __OHLC_H
    #DEFINE __OHLC_H
    
    typedef struct myohlc{
           float open;
           float high;
           float low;
           float close;
    }ohlc;
    
    #ENDIF
    e nel source voglio acquisire dei dati da file che passo da riga di comando (argv[1])

    i dati sono scritti in 4 colonne e ciascuna riga contiene in seguenza open, high, low, close
    è corretto il seguente source per cerare un array di struct del ripo ohlc che contenga i dati acquisiti dal file txt?
    (ho usato lo stream del stdio perchè ancora sto capendo come funzionano le stream class del C++)

    codice:
    #IFNDEF __OHLC_CPP
    #DEFINE __OHLC_CPP
    
    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    #include "ohlc.h"
    
    
    using namespace std;
    
    int main(int argc, char **argv){
      int N, i=0;  
      FILE *stream;
      //ohlc --> typdef struct ohlc presente in ohlc.h, size = sizeof(float)*4
      ohlc* dati;
      cout << "inserire numero barre OHLC da acquisire: ";
      cin >> &N;
      
      dati = (ohlc*)calloc(N, sizeof(ohlc)); 
      
      //passo dati da terminale
      stream = fopen( "argv[1]", "r");
      
      //acquisisco file da argv[1]
      while( stream != NULL){
      scanf = ("%f%f%f%f", dati[i]->open, dati[i]->high, dati[i]->low, dati[i]->close));
      i++;
      }
      fclose(stream);
    grazie mille

    p.s. penso ci sia un problema con l'header....cioè praticamente eseguendo typdef in quel modo non ho capito se il nuovo tipo è myohlc o ohlc??? l'errore che mi dà è che -> operand in dati[i]-> non è un puntatore myohlc?

  2. #2

    Re: [C++] acquisire dati da file

    Originariamente inviato da Toxotes
    Scusate non sono sicuro di aver fatto un buon lavoro:

    nell'header "ohlc.h" dichiaro un nuovo tipo detto ohlc come segue

    codice:
    #IFNDEF __OHLC_H
    #DEFINE __OHLC_H
    
    typedef struct myohlc{
           float open;
           float high;
           float low;
           float close;
    }ohlc;
    
    #ENDIF
    • le direttive del preprocessore vanno in minuscolo;
    • i nomi che iniziano per doppio underscore (e quelli con underscore seguito da lettera maiuscola) sono riservati per uso da parte del compilatore; per i tuoi include guards usa semplicemente OHLC_H;
    • in C++ quel giochino con il typedef non è necessario. Basta semplicemente
      codice:
      struct ohlc
      {
             float open;
             float high;
             float low;
             float close;
      };

    (ho usato lo stream del stdio perchè ancora sto capendo come funzionano le stream class del C++)
    Dovresti impararli, di base sono più semplici da usare rispetto a quelli C...
    codice:
      dati = (ohlc*)calloc(N, sizeof(ohlc));
    In C++ non si usa malloc/calloc, ma new.
    codice:
    #IFNDEF __OHLC_CPP
    #DEFINE __OHLC_CPP
    Non si mettono gli include guard nei file .cpp (non servono a niente, dato che i .cpp non vanno inclusi).
    codice:
      while( stream != NULL){
      scanf = ("%f%f%f%f", dati[i ]->open, dati[i ]->high, dati[i ]->low, dati[i ]->close));
    Qui è tutto sbagliato.
    • stream non "diventa" mai NULL, devi usare feof e/o ferror per verificare se il file non è terminato e/o c'è stato un errore di lettura;
    • la sintassi per richiamare una funzione è nomefunzione(listaparametri); inoltre, i parametri della scanf in cui memorizzare i valori letti vanno passati per puntatore;
    • il valore di fscanf va controllato per verificare se i dati sono stati letti correttamente;
    • l'uso di -> è sbagliato; -> si usa per accedere ai membri dell'oggetto tramite un puntatore ad esso (obj->membro è equivalente a (*obj).membro), ma lì non hai un puntatore, hai già l'oggetto (dati[i ] non è un ohlc *, ma un ohlc); ergo, devi usare il punto.


    Inoltre, al termine del programma non rilasci la memoria allocata con calloc (per ogni malloc/calloc ci vuole una corrispondente free).
    p.s. penso ci sia un problema con l'header....cioè praticamente eseguendo typdef in quel modo non ho capito se il nuovo tipo è myohlc o ohlc??? l'errore che mi dà è che -> operand in dati[i ]-> non è un puntatore myohlc?
    myohlc e ohlc nel tuo codice sono sinonimi, si possono usare entrambi senza problemi; il problema che ti segnala il compilatore è un altro (stai usando -> su un oggetto e non su un puntatore).
    In ogni caso, quel giochino del typedef è un residuo del C e non è più necessario in C++. In C quando si dichiara una struct in questa maniera:
    codice:
    struct ohlc
    {
        ...
    };
    per riferirsi ad essa poi bisogna scrivere sempre "struct ohlc"; per risparmiarsi di scrivere continuamente "struct", si è imposto l'idioma di usare sempre un typedef con le struct:
    codice:
    typedef struct {
        ...
        } ohlc;
    dato che i sinonimi definiti con il typedef non hanno necessità di particolari prefissi.
    Quanto all'uso dei due nomi (ovvero typedef struct myohlc { ... } ohlc, serve per motivi particolari, ma in genere non è necessario.

    In ogni caso, in C++ tutto questo è inutile, visto che se scrivi
    codice:
    struct ohlc
    {
        ...
    };
    non è più necessario specificare "struct" ogni volta. Ergo, tutto il giochino dei typedef per le struct risulta inutile.

    ---

    In ogni caso, ho l'impressione che tu abbia una certa confusione in testa a proposito di C e C++ (forse derivante dall'aver letto guide sparse in giro su Internet), onestamente ti consiglio di recuperare un buon libro di C++ e leggerne almeno i primi capitoli prima di continuare.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    si hai ragione, avevo studiato abbastanza il C all'università ma sono arrugginito e ora ho preso in mano il C++....si quel fscanf è scritto da cani in effetti

    ora con un pò di calma mi studio meglio il tutorial sul C++ che ho trovato sul sito cpp così capisco un pò le varie classi...grazie per la pazienza, penso che fra un pò se potrai, mi riservirà il tuo giudizio, ciao ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2011
    Messaggi
    41
    che dici MItaly mi avvicino alla meta??


    header



    codice:
    #ifndef OHLC_H
    #define OHLC_H
    
    struct ohlc{
           float open;
           float high;
           float low;
           float close;
    };
    
    #endif
    source

    codice:
    #include <iostream>
    #include <fstream>
    #include <cmath>
    #include "ohlc.h"
    
    using namespace std;
    
    int main(int argc, char **argv){
      int N, i=0;  
      ohlc* ohlcdata;
      ifstream dati;
      
      //definisco lo spazio necessario acquisire i dati
      cout << "inserire numero barre OHLC da acquisire: ";
      cin >> N;
      
      //alloco la memoria per acquisire dati
      ohlcdata = new ohlc[N];
      
      //acquisisco i dati
      dati.open("argv[1]");
      while(!dati.eof()){
                         cin >> ohlcdata[i].open;
                         cin >> ohlcdata[i].high;
                         cin >> ohlcdata[i].low;
                         cin >> ohlcdata[i].close;
                         i++;
                         }
      
      //finite le operazioni
      delete [N] ohlc;

    dimenticavo: non trovo o non so comprendere info riguardo a come il puntatore a file scorre i dati. se sono del tipo :

    dato1a dato1b dato1c dato1d

    e così via in 4 colonne li legge per riga vero non in colonna???

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.