Qualcosa di sbagliato nel ciclo[c++]

di il
18 risposte

Qualcosa di sbagliato nel ciclo[c++]

Salve, io dovrei leggere da un file di input(A) alcuni numeri, ritrovare questi numeri in un file(B) e in base ai numeri ritrovati, esportare una parte di testo del file(B) in un file di output(C)(un file di output per ogni numero trovato nel file(A)). I file di output mi vengono prodotti tutti ma solo quello relativo al primo numero viene riempito con i dati giusti. Che errore ho commesso nel ciclo?
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <cmath>
#include <iomanip>

using namespace std;

const int NUM_FILE = 20;

string converter (double ms,int index,string nome);

int main()
{
    string parag[200],str,file[NUM_FILE],filevar;
    string nomemass;
    double massf, massData;

    ifstream inn[NUM_FILE],inVar;
    ofstream outt[NUM_FILE][200],outintest[NUM_FILE][200];

    cout << "File contenente le variabili: ";
    getline(cin,filevar);

    inVar.open(filevar.c_str());

    cout << "Inserire i nomi dei file di input(terminare dando la barra spaziatrice): ";

    int ord=-1;
    do
    {
        ord++;
        getline(cin,file[ord]);
    }while (file[ord] != " ");

    int k = 0;

    inVar.ignore(2000, ')');

    inVar >> massf;       // massa cercata dall'utente

    while(!inVar.eof())
    {
        massf = massf + 1.0079;

        nomemass = converter(massf,k,nomemass);

        for(int j=0; j<ord; j++)
        {
            inn[j].open(file[j].c_str());
            outt[j][k].open(string("Out" + nomemass + file[j]).c_str());

            outintest[j][k].open(string("Intest"+ nomemass + file[j]).c_str());     // apro file output con solo intestazioni

            while(inn[j])
            {
               Lunga porzione di codice che vi risparmio ma che ho testato e funziona
                                                                                         
            }
        }

        k++;

        inVar.ignore(2000,')');

        inVar >> massf;

    }

    return 0;
}

string converter(double ms,int index,string nome)
{
    ostringstream os[200];

    double massaconvert = ms;

    os[index] << massaconvert;         // trasformo la massa(double) in string per chiamare il file con la massa

    nome = os[index].str();

    return nome;
} 
p.s. inutile dire che i file di input sono assolutamente ripetitivi quindi non c'è differenza di lettura tra un'iterazione e l'altra.

18 Risposte

  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Non ho capito molto del problema ... o lo descrivi meglio o fai qualche esempio concreto ...
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Allora: nel file(A) ho qualcosa del genere:
    (1357) 927.587@2.01800
    (1378) 663.455@3.074
    (1429) 763.5691@12.30977
    (1348) 589.3478@1.705
    (1349) 501.2998@1.708 ecc. ecc.

    Ora io devo prendere i numeri dopo le parentesi(solo quelli prima della @) e cercare questi numeri in un altro file(B) fatto così
    BEGIN IONS
    PEPMASS=301.1416545
    CHARGE=1+
    TITLE=pos-AMIO100B.d, MS/MS of 301.1416545 1+ at 0.0480166666666667 mins
    RTINSECONDS=2.881
    55.0179799933443 107.9395
    67.0550597843385 81.8421
    71.0869866224829 104.225
    81.0710484252295 127.1201
    86.0586187733864 83.93951
    95.0853591011813 96
    99.0438152096056 94.81071
    111.041942436332 84.00555
    115.054858545217 62.19512
    117.068768750004 39.14881
    140.892514516904 52.24
    146.992365416821 60.00266
    161.332016024087 30.00926
    561.574605408958 30.00236
    END IONS
    BEGIN IONS
    PEPMASS=294.2065464
    CHARGE=1+
    TITLE=pos-AMIO100B.d, MS/MS of 294.2065464 1+ at 0.0505833333333333 mins
    RTINSECONDS=3.035
    55.0185267098124 142.88... ..ecc ecc

    Nella fattispecie devo individuare questi numeri dopo la dicitura MS/MS of. Se trovo il numero preso dal file (A) nel file(B) allora devo prendere il testo che va da BEGIN IONS fino a END IONS e copiarlo in un file di output proprio di quel numero. Prendiamo il primo numero del file(A): in questo caso cerco il numero 927.587 nel file(B), quando lo trovo prendo la sezione che lo contiene che va da BEGIN fino a END e la scrivo in un file che chiamo Out927.587blablabla.mgf
    Questa operazione mi riesce solo per il primo numero del file(A); per gli altri no.

    Sono stato un po' più chiaro?
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Sei stato molto più chiaro ... ma quando dici
    Questa operazione mi riesce solo per il primo numero del file(A); per gli altri no.
    intendi che dal secondo numero non trovi più i valori nel secondo file (pur essendoci) o che succede qualcosa di diverso (errori, crash ...) ?
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Intendo che i file di output con il nome corretto mi vengono generati per tutti gli altri numeri ma sono tutti vuoti (e invece dovrebbero contenere dati)
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Io ottengo subito una eccezione di "stack overflow" a causa, ovviamente, di questa dichiarazione
    
    ofstream outt[NUM_FILE][200],outintest[NUM_FILE][200];
    
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    A me non compare quest'avviso. Ad ogni modo ho provato a cambiare la costante NUM_FILE e ponendola uguale ad 1 ma comunque mi dà lo stesso problema.
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Non riesco a compilare ed eseguire il tuo codice per mancanza di informazioni sui file in input (nomi e contenuto).

    (e non riesco a capire perché hai dichiarato tanti oggetti ofstream ...)

    Mi dispiace.
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Se ti passassi in mp il codice completo e i due file di input? Ti sarebbe di molto impiccio? Scusami ma è da un po' di giorni che non riesco a venire a capo del problema
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Okay, ma i risultati te li fornisco nel forum.
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Finalmente ci sono riuscito! Non chiudendo il file inn[j] dopo averlo letto una prima volta non riusciva a rileggerlo. Grazie!
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    roov_raven ha scritto:


    Finalmente ci sono riuscito! Non chiudendo il file inn[j] dopo averlo letto una prima volta non riusciva a rileggerlo. Grazie!
    Ok ... comunque continuo a non capire perché prevedi 40000+40000 (80 mila !) oggetti di tipo ofstream ... è ovviamente un errore ...
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    In realtà mi ero lasciato la possibilità di leggere i dati fino a un massimo di 20 file(B).
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    roov_raven ha scritto:


    In realtà mi ero lasciato la possibilità di leggere i dati fino a un massimo di 20 file(B).
    E il [200] a cosa serve ?
  • Re: Qualcosa di sbagliato nel ciclo[c++]

    Perché mi serviva un output per ogni numero trovato nel file(A), numeri che possono verosimilmente essere 200.
Devi accedere o registrarti per scrivere nel forum
18 risposte