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?