Come mai sto ottenendo risultati strani con istream :: get (char *, streamsize n, char delim)?
-
20-09-2019 - |
Domanda
Sto leggendo in un file con un formato simile a:
TIME, x, y, z
00:00:00.000 , 1, 2 , 3
00:00:00.001 , 2 , 3 , 4
ecc, e il codice simile al seguente:
std::ifstream& istream;
char buffer[15];
double seconds, hours, mins; // initialised properly in real code
// to read in first column
istream.get(buffer, 14, ',');
int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds);
Si legge nella prima multa colonna per la maggior parte del tempo. Tuttavia, di tanto in tanto lo sscanf non riesce, e quando posso controllare ciò che è nel buffer utilizzando il debugger CodeGear vedo che ha letto in \000:00:023
per esempio. Per qualche ragione essa raccoglie un carattere nullo, \0
, frontalmente. Quando guardo nel file di testo, sembra essere lo stesso formato di tutti gli altri valori di tempo che sono stati letti in modo corretto. Perché è di tanto in tanto l'aggiunta di un carattere null? E c'è un lavoro in giro?
Soluzione
L'utente ha letto una riga vuota, o si sta cercando di leggere oltre la fine del file.
Il primo carattere è \0
, che indica la fine della stringa.
Tutti i caratteri dopo che sono la memoria intatta.
Altri suggerimenti
provare questo e vedere ..
ifstream inpfile("sample.txt");
char buffer[15];
inpfile.ignore(80, '\n');
while (!inpfile.eof())
{
inpfile.get(buffer, 14, ',');
int hrs, mins;
double secs;
hrs = mins = secs = -1;
sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs);
cout << "hrs:" << hrs << "\t"
<< "mins:" << mins << "\t"
<< "secs:" << secs
<< endl;
inpfile.ignore(80, '\n');
}
molto probabilmente si dispone di una virgola finale nel file di input da qualche parte. o forse più di 14 caratteri di spazio bianco dopo l'ultimo numero su una linea.