Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434

    [c++] suddividere un file di testo in più file

    Ciao, ho la necessità di suddividere un file di testo in tanti altri file... Questo file grosso contiene una riga costante che mi permette di stabilire il punto in cui deve finire il piccolo file e cominciarne un altro. Si tratta per la precisione di un file MBOX contenente circa 40 messaggi, cominciano tutti con "From mioemail@dominio.it" e io vorrei avere 40 file ognuno contenente le informazioni per un messaggio. Questo è il mio codice:

    #include <iostream>
    #include <fstream>
    #include <cstring>
    #include "itoa.cpp"

    using namespace std;


    int main() {

    char divString[100]; // la stringa che determina la divisione
    char msgLine[10000]; // la linea del messaggio
    char numString[5]; // il contatore convertito in stringa
    char baseString[10]; // il prefisso dei nuovi file
    char fileName[15]; // il nome completo del file

    int counter = 1; // contatore per nomi dei file

    //apro in input il file MBOX unico
    ifstream mboxFile("sent", ios::in | ios::binary);

    // apro in output un file di nome sent0, giusto per inizializzare
    // newMboxFile
    ofstream newMboxFile("sent0", ios:ut | ios::binary);

    // imposto divstring e basestring
    strcpy(divString, "From mioindirizzo@miodominio.it");
    strcpy(baseString, "sent");

    // comincia il ciclo principale...
    do {

    // ottengo la prima linea del file unico
    mboxFile.getline(msgLine, sizeof msgLine);

    // se trovo un'occorrenza di divstring nella linea estratta...
    if(strstr(msgLine, divString)) {
    newMboxFile.close(); // ... chiudo il file precedente

    itoa(counter, numString, 10); // converto in stringa
    strcpy(fileName, baseString); // aggiungo il prefisso
    strcat(fileName, numString); // aggiungo il contatore

    // apro un nuovo file che conterrà il nuovo messaggio
    ofstream newMboxFile(fileName, ios:ut | ios::binary);

    cout << "Ho appena aperto lo stream " << fileName << ". Questi sono i bit di errore: " << newMboxFile.fail() << ", bad: " << newMboxFile.bad() << "\n";

    counter++; // per differenziare i nomi dei file
    }

    cout << "\nDevo scrivere in " << fileName << ". Questi i bit di errore: " << newMboxFile.fail() << ", bad: " << newMboxFile.bad() << "\n";


    newMboxFile.write(msgLine, sizeof msgLine);

    } while (!mboxFile.eof()); //... sino a quando non arrivo ad eof()


    cout << "\nMissione Completata!!"; // evvai!
    return 0;
    }

    e questo è l'output:

    Ho appena aperto lo stream sent1. Questi sono i bit di errore: 0, bad: 0

    Devo scrivere in sent1. Questi i bit di errore: 0, bad: 0

    Devo scrivere in sent1. Questi i bit di errore: 1, bad: 1
    e poi continuano tutti così: in scrittura ho tutti errori, sia il badbit che il failbit, mentre in apertura è tutto ok!


    Inoltre, commentando l'istruzione newMboxFile.write() e lasciando il resto invariato, ottengo questo:

    Ho appena aperto lo stream sent1. Questi sono i bit di errore: 0, bad: 0

    Devo scrivere in sent1. Questi i bit di errore: 0, bad: 0

    Devo scrivere in sent1. Questi i bit di errore: 0, bad: 0

    [ ... ]

    Ho appena aperto lo stream sent2. Questi sono i bit di errore: 0, bad: 0

    Devo scrivere in sent2. Questi i bit di errore: 1, bad: 0

    Devo scrivere in sent2. Questi i bit di errore: 1, bad: 0

    Devo scrivere in sent2. Questi i bit di errore: 1, bad: 0

    etc.... etc....
    Dove ho sbagliato?

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    Visto il "successone" del topic provo a riformulare la domanda:

    come posso aprire in scrittura 10 files di nome rispettivamente test1, test2, test3, test4, ..., test10 e scriverci dentro la stringa "ciao"?

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da Sifr
    come posso aprire in scrittura 10 files di nome rispettivamente test1, test2, test3, test4, ..., test10 e scriverci dentro la stringa "ciao"?
    codice:
    #include <fstream>
    #include <cstdio>
    
    using namespace std;
    
    int main (void)
    {
        char fname[16];
    
        for (int i = 0; i < 10; i++)
        {
            sprintf (fname, "test%d", i+1);
    
            ofstream fout(fname, ios::trunc);
            fout << "ciao" << endl;
            fout.close ();
        }
    
        return 0;
    }
    Non mi sembra difficile.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    Ok grazie, sulla base di quello sono riuscito a scrivere il programmino completo.

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.