[c++] errore in lettura

di il
3 risposte

[c++] errore in lettura

Salve, devo leggere da un file fatto così (ho preso solo una parte che mi interessa)
  • 48 54 1 6
    52 56 1 0
    53 55 1 0
    54 57 1 0
    M CHG 1 9 1
    M END
    > <FRAGMENT_MATCHES>
    61.0437
    91.0511
    93.0698
    105.068
    107.086
    135.082
    137.057
    137.069
    141.071
    149.022
    149.055
    150.028
    165.089

    > <FRAGMENT_MATCH_COUNT>
    13

    > <FRAGMENT_MATCH_SCORE>
    92.1461

    > <ION_SYMBOLISM>
    [M + H4N]+

    > <MSMS_TITLE>
    rt: 1.294 mz: 834.282
solo i numeri dopo FRAGMENT_MATCHES e l'ultimo numero che compare (in questo caso 834.282). A questo proposito ho implementato un programma così strutturato
#include <iostream>
#include <fstream>
#include <list>
#include <string>
#include <cmath>

using namespace std;

int main()
{
    list<double> fraglist;
    list<double>::iterator myIt;
    string sdfname, namelip, lineflag;
    string discard,classe, mod;
    ifstream insdf,infrag;
    ofstream out;
    char ch;
    double frag, fragtemp, mz;

    getline(insdf,lineflag);
    size_t found = lineflag.find("FRAGMENT_MATCHES");

    while(found == string::npos)
    {
        getline(insdf,lineflag);
        found = lineflag.find("FRAGMENT_MATCHES");
    }

    // cominciano i frammenti

    while(insdf >> frag)
    {
        fraglist.push_back(frag);
        cout << frag << endl;
    }


    // ricerco picco parente

    getline(insdf,lineflag);
    found = lineflag.find("MSMS");
    cout << lineflag;

    while(found == string::npos)
    {
        getline(insdf,lineflag);
        found = lineflag.find("MSMS");
    }
Dopo aver letto i numeri che seguono FRAGMENT_MATCHES l'input dovrebbe essere > <FRAGMENT_MATCH_COUNT> e così via, invece stampando a video la stringa in input esce scritto sempre > <FRAGMENT_MATCHES> e l'ultimo ciclo riportato mi diventa infinito. Perché?

3 Risposte

  • Re: [c++] errore in lettura

    Il ciclo ti diventa infinito perchè non c'è una vera e propria condizione di uscita.
    in quanto la condizione found == string::npos una volta trovato il record non lo cambia più.
    per risolvere l'altro problema ti consiglio di impostare una variabile a 0 ed implementare il ciclo con questa logica.
    uscita = 0;
    while ( uscita <=1)
    {
    getline(insdf,lineflag);
    // verifico la fine della lista e se si verifica setto a 2 la variabile uscita
    if (lineflag.find =="FRAGMENT_MATCHES")
    { // qui svolgo le mie operazioni );
    }

    spero di esserti stato d'aiuto
  • Re: [c++] errore in lettura

    In realtà il primo ciclo mi funziona. E' il secondo che è infinito poiché continuando a leggere sempre la riga FRAGMENT_MATCHES non si verifica mai la condizione lineflag.find != string::npos. Non capisco perché lo stream di input resti bloccato su quella riga.
  • Re: [c++] errore in lettura

    Quale ciclo non ti funziona?
    1)
     while(insdf >> frag)
        {
            fraglist.push_back(frag);
            cout << frag << endl;
        }
    oppure
    2)
    while(found == string::npos)
    {
    getline(insdf,lineflag);
    found = lineflag.find("MSMS");
    }
    perchè se è il due il motivo potrebbe essere questo:
    essendo MSMS una perifrasi cioè una parte del nome
    l'istruzione
    found = lineflag.find("MSMS");
    non riesce a trovare il match con il campo caricato.
    quindi dovresti mettere "MSMS_TITLE" per esempio.

    smalldragon ha scritto:


    il ciclo ti diventa infinito perchè non c'è una vera e propria condizione di uscita.
    non essendoci come ti avevo detto prima una
    perchè non metti una condizione di uscita che includa la fine della lista?
    questo ti dovrebbe impedire che il ciclo diventi infinito.
    se invece è il 1 sto ancora cercando di capire quale possa essere l'errore!
Devi accedere o registrarti per scrivere nel forum
3 risposte