Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    23

    [codeblock C++] problemino facile facile ma incasinato con file .txt

    Ciao a tutti,ho un piccolo problema,la sitazione e questa: ho un file .txt composto da righe che iniziano con "+" tra queste righe ce ne sono certe che non iniziano con quel carattere, a me interessano quelle....
    in particolare il file e fatto cosi:

    +
    +
    +
    +
    +
    +
    +
    45
    +
    +

    come vedete mi interessa la riga con 45, io voglio cambiare quel 45 con un'altro numero, la domanda e questa:
    Come faccio a cancellare quell'int e scriverne un'altro??????

    e se avessi piu int su una riga come faccio posizionarmi sulla riga e cancellare la riga intera???
    grazie

  2. #2

    Re: [codeblock C++] problemino facile facile ma incasinato con file .txt

    Un file, dal punto di vista del C/C++, viene visto come una sequenza di bytes terminanti con l'EOF, che non è nient'altro che la fine fisica del file. Dunque: apri il file con la fopen() del C o la obj.open() del C++, con la fread() ti trovi la riga che non inizia con il +, ti ri-posizioni al suo inizio con fseek() (dato che leggendo sei andato N-bytes avanti) e ci riscrivi sopra: niente di più, niente di meno. Il problema è che devi determinare la lunghezza del numero letto, ovvero il numero delle cifre (in questo caso 45 ne ha due), perchè non puoi cancellare effettivamente quel numero ma puoi solo riscriverci sopra e, tra l'altro, se il numero è a due cifre come in questo caso devi scriverci su altre due cifre, che siano essi spazi (per simulare una cancellazione) o altri numeri.

    Potresti però ovviare al problema del riscrivere due cifre, nel seguente modo: supponendo che anzichè 45 hai un numero lungo 20 caratteri o una stringa di testo, puoi far così: ti trovi la riga come visto sopra, ti trovi la riga successiva e ti leggi l'intero file da quel punto in poi, memorizzando il tutto in un buffer (o in un file temporaneo, a questo servono alla fine ), a questo punto ti posizioni ad inizio riga da cancellare e cominci a copiarci dentro tutto il file temporaneo/buffer letto. In questo modo hai una riga in meno

    Ps: il secondo metodo potrebbe essere piuttosto lagnoso con files di grandi dimensioni... vedi un pò te. Spero di esserti stato utile..
    -Xant
    [White Thoughts - What Happens Inside Us]
    [myxperiments projects and contacts page]

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    23
    grazie mille..io avevo provato cosi:

    FILE *fp;
    fp=fopen("mio.map","w");

    //aggiorno il numero totale di access point
    fseek ( fp , 8 , SEEK_SET );
    fputs ( " sam" , fp );
    //scrivo i parametri

    ma il risultato è che invece di scendere di righe dall'inizio del file(inizio della prima riga) conta 36 spazi e scrive sam
    per essere chiaro il file invece di uscire cosi:

    ...
    +
    +
    sam
    +
    +
    ...

    mi esce cosi:

    + sam
    +
    +
    +
    +
    ...
    45
    +
    +

    a questo punto ho un'altra domanda:
    se io avessi solo un numero e dovessi incrementarlo dovrei leggerlo e poi trasformarlo in int,incrementarlo e poi riscriverlo...come posso fare?
    grazie mille

  4. #4
    Leggi la riga con un bel
    codice:
    int x;
    fscanf(fp, "%d", &x);
    -Xant
    [White Thoughts - What Happens Inside Us]
    [myxperiments projects and contacts page]

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    23
    sio ok...ma il mio problema per me fondamentale e scendere delle righe per che se io faccio il fseek non scende le righe ma sposta il cursore sulla stessa riga(la prima)di tanti spazi quanti il valore ke gli do nel fseek!!!!infatti il file mi esce con "sam" scritto 8 spazi dopo il + della prima riga!!!!
    devo capire com caxxo scendere di una riga

  6. #6
    Usa una funzione di questo genere:
    codice:
    /* skips the given number of lines in the given stream
    returns the number of lines actually skipped */
    unsigned int ignoreLines(FILE * stream, unsigned int lineNum)
    {
        unsigned int lineCount=0;
        while(lineCount<lineNum)
        {
            switch(fgetc(stream))
            {
            case EOF:
            case 0:
                lineCount++;
                return lineCount;
            case '\n':
                lineCount++;
                break;
            }
        }
        return lineCount;
    }
    .
    Non l'ho collaudata, se hai problemi chiedi pure.
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2008
    Messaggi
    23
    io ho bisogno di un codice che mi permetta di spostrami di qulache riga in giu anzi ad essere precisi di 3 rige in giu, leggere un intero e incremenentarlo o decrementarlo,e poi scegliere un riga e poterla cancellare,o andare alla fine del file e aggiungere una riga, per l'aggiunta della riga non ho problemi, il problema arriva nel posizionamento alla riga giusta!!!qualcuno mi aiuti...per favore!!!!!!

  8. #8
    Come già detto, usa la funzione che ti ho scritto per saltare quante righe vuoi.
    codice:
    /* Salta 3 righe del file tuoFile */
    ignoreLines(tuoFile,3);
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.