.txt .exe .txt e funzione sprintf

di il
27 risposte

.txt .exe .txt e funzione sprintf

Salve a tutti sono nuovo del forum e ancora non esperto di C++ ma a lavoro mi assegnano dei compiti che spesso mi risultano ancora molto difficili, per questo sarebbe gentilissimo da parte vostra se ci fosse qualcuno in grado di aiutarmi nella risolizione del mio problema.
In poche parole dovrei trasfrire dei dati da un .txt ad un altro .txt e numerare progressivamente l'intestazione di ogni riga nel modo 001, 002, 003, ..., 010 e così via, cioè a tre cifre) quando i dati vengono riscritti nel secondo .txt.
Ho scritto un programma che sostanzialmente assolve al compito, ma la cosa in cui proprio non riesco è trovare un modo per far comparire all'inizio di ogni riga la numerazione progressiva a tre cifre desiderata del tipo come esemplificata sopra tra parentesi. Nel mio programma (che lascero qui di seguito) uso banalmente una var int dichiarata, che si auto incrementa ad ogni ciclo while, ma purtroppo mi è stato detto che così non va bene :,( L'unico suggerimento che mi hanno dato è di usare la funzione sprintf che purtroppo non conosco e che per questo non so maneggiare ancora bene.
Avete un idea di come poter fare per risolvere? Ve ne sarei molto grato.

#include <iostream>
#include <fstream>
using namespace std;

//Definisco dei parametri facilmente modificabili
#define MAX_LINES 50
#define MAX_LINE_LEN 255


int main(int argc, char *argv[])
{

ofstream f("C:\\AveMariaEin.txt"); //se il file non esiste lo crea, altrimenti lo sovrascrive!


// strings array declaration
char row[MAX_LINE_LEN];

// open text file
ifstream in( "C:\\AveMaria.txt" );

int rowNumber = 0;
int j = 0;

//each row wi
while ( !in.eof() )
{
rowNumber++;
in.getline(row, MAX_LINE_LEN);
f << rowNumber << row << endl;
}

27 Risposte

  • Re: .txt .exe .txt e funzione sprintf

    Il problema sta nel fatto che un int non ti può stampare gli zeri iniziali. Per questo devi usare una stringa, che puoi stampare anche con la sprintf.

    La sprintf non è altro che la fprintf dove però prende il suo input da una stringa.

    Spero ti sia stato di aiuto.
  • Re: .txt .exe .txt e funzione sprintf

    Capisco. Molte grazie, certo che mi sei stato d'aiuto! Quindi se ho capito bene, ogni riga di dati che vengono trasferiti nel l'altro documento .txt deve essere una cosa nel ciclo del while del tipo:

    sprintf( f, rowNumber, row, endl)

    // che ovviamente sintatticamente è un abominio, ma non so davvero per niente usare questa funzione sprintf e non ho davvero idea come creare all'atto pratico un contatore dinamico che si incrementa di uno ad ogni riga nuova a tre cifre, e che copra gli eventuali spazi vuoti dei posti lasciati vuoti con degli zeri del tipo appunto:

    001
    002
    .
    .
    011
    .
    .
    .
    099
    .
    .
    e così via.

    Saresti così gentile da scrivermi un esempio pratico di codice scritto per implementare questo contatore?

    Grazie mille ancora
  • Re: .txt .exe .txt e funzione sprintf

    Con printf (e simili) si può scrivere

    printf( "%05d\n", rowNumber);
  • Re: .txt .exe .txt e funzione sprintf

    Come già ti confermava oregon, la sprintf funziona alla stessa maniera della printf e simili.

    Per quanto riguarda la soluzione al tuo problema, io vedrei un ciclo while fino a fine file che legge la riga e la deposita su una stringa temporanea. Subito dopo scrivi sul secondo file la stringa con il numero, lo spazio e la stringa appena letta, incrementi la stringa numero e avanti così per tutto il file.
  • Re: .txt .exe .txt e funzione sprintf

    Molte grazie per la risposta. Sono riuscito ad andare ulteriormente avanti e credo di avercela quasi fattta e che la riga con la funzione sprinf che faccia al caso mia sia la seguente:

    sprint("%05d %row\n", rowNumber, row);

    adesso però mi da questo errore in fase di compilazione che non so interpretare:

    in function 'int main(int, char**)'
    invalid conversion from 'intto const char*'
    initializing argument 2 of 'int sprint(char*, const char*, ...)'

    grazie ancora per le eventuali risposte
  • Re: .txt .exe .txt e funzione sprintf

    No ... cosa è %row ? E poi non è sprint ma sprintf ... Hai mai letto la documentazione delle funzioni che usi?

    Sarà

    sprintf (buffer, "%03d %s", rowNumber, row);

    ovviamente devi prevedere l'array buffer di destinazione

    Per chiarimenti leggi

    http://www.cplusplus.com/reference/cstdio/sprintf
  • Re: .txt .exe .txt e funzione sprintf

    Se row contiene la stringa, allora nella sprint il formato di conversione non è %row, ma %s.

    Prova a fare questa modifica e vedi se funziona.
  • Re: .txt .exe .txt e funzione sprintf

    SVNiko ha scritto:


    allora nella sprint
    Ancora sprint .... non esiste ... è sprintf
  • Re: .txt .exe .txt e funzione sprintf

    Già!
  • Re: .txt .exe .txt e funzione sprintf

    Dunque innanzi tutto grazie per tutte la risposte.
    Sono andato avanti ma ancora non riesco a farlo funzionare. Ho letto la documentazione della funzione sprintf e credo di aver creato qualcosa che si avvicina a quello che mi servirebbe ma ancora non gira. Allego qui di seguito la funzione sprintf.
    Per Oregon: row è l'array di strings dichiarato (vedi sopra) nel programma.

    la mia funzione sprintf è:

    f << sprintf(row, "%03d %s\n, rowNumber, row);

    come risultato nel txt dopo il run ottengo solo una serie di numeri precisamente 46264156342554310

  • Re: .txt .exe .txt e funzione sprintf

    Hai letto ma non compreso appieno l'uso della sprintf. Non a caso ti avevo scritto di usare un

    buffer

    come mostrato nell'esempio di cui al link che ti ho indicato.

    E' buffer che poi devi passare al file ...
  • Re: .txt .exe .txt e funzione sprintf

    Salve, si in effetti e'una funzione per me nuova con cui riscontro ancora qualche difficolta'nell'usarla.

    Comunque ho preso in considerazione il tuo consiglio Oregon e ora va molto meglio. Credo manchi molto poco al suo funzionamento corretto. Spero.
    Adesso succede questo, con il seguente ciclo while:

    while ( !in.eof() )
    {
    rowNumber++;
    in.getline(buffer, 200);
    printf ("%03d %s\n", rowNumber, buffer);
    }

    il programma funziona perfettamente, ma solo il .exe invece a me interessa che il programma funzioni sul .txt dove voglio che il buffer trasferisca i dati
    Quando inserisco invece la fnzione fprint con i suoi parametri nel modo mostrato qui di seguito escono fuori caratteri strani sia sul .exe sia sul .txt. Non ne capisco il motivo.


    while ( !in.eof() )
    {
    rowNumber++;
    in.getline(buffer, 200);
    sprintf (buffer, "%03d %s\n", rowNumber);
    printf ("%03d %s\n", rowNumber, buffer);
    f << buffer << endl;
    }
  • Re: .txt .exe .txt e funzione sprintf

    il programma funziona perfettamente, ma solo il .exe invece a me interessa che il programma funzioni sul .txt dove voglio che il buffer trasferisca i dati
    Quando inserisco invece la fnzione fprint con i suoi parametri nel modo mostrato qui di seguito escono fuori caratteri strani sia sul .exe sia sul .txt. Non ne capisco il motivo.
    Postresti spiegare meglio che significa solo il .exe?
  • Re: .txt .exe .txt e funzione sprintf

    Si, mi scuso per la poca correttezza dei termini tecnici ma come detto non ho ancora molta esperienza. Con .exe intendo il riquadro a sfondo nero dove vengono visualizzati i risultati della funzione printf.

    Di seguito invece riporto il risultato dello sprintf con i parametri sopra descritti:

    001 Ç…ôüÿÿà@

    002 Ç…ôüÿÿà@

    003 Ç…ôüÿÿà@

    004 Ç…ôüÿÿà@

    005 Ç…ôüÿÿà@

    006 Ç…ôüÿÿà@

    007 Ç…ôüÿÿà@

    008 Ç…ôüÿÿà@
Devi accedere o registrarti per scrivere nel forum
27 risposte