C ++ cin numeri ignora prima linea?
Domanda
ho incontrato un problema davvero strano. Posso riprodurre sul mio portatile win7 così come una macchina Ubuntu.
Ho un programma C ++ in questo modo:
#include <string>
#include <sstream>
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 9; i++) {
string line;
getline(cin, line);
stringstream ss(line);
for (int j = 0; j < 9; j++) {
int p = 8;
ss >> p;
cout << p;
}
cout << endl;
}
return 0;
}
Ora, se compilo è una corsa con ./a.out < test.txt
dove text.txt
contiene:
1 2 3 4 5 6 7 8 9
2 2 3 4 5 6 7 8 9
3 2 3 4 5 6 7 8 9
4 2 3 4 5 6 7 8 9
5 2 3 4 5 6 7 8 9
6 2 3 4 5 6 7 8 9
7 2 3 4 5 6 7 8 9
8 2 3 4 5 6 7 8 9
9 2 3 4 5 6 7 8 9
Sarà in uscita (senza spazi):
8 8 8 8 8 8 8 8 8
2 2 3 4 5 6 7 8 9
3 2 3 4 5 6 7 8 9
4 2 3 4 5 6 7 8 9
5 2 3 4 5 6 7 8 9
6 2 3 4 5 6 7 8 9
7 2 3 4 5 6 7 8 9
8 2 3 4 5 6 7 8 9
9 2 3 4 5 6 7 8 9
Perché è la prima linea di sbagliato? Ho provato a leggere la prima riga fuori dal giro pure.
Inoltre, se sostituisco ss > p
con cin > p
ottengo solo una tabella piena potenza di 8 di.
Questo non sta facendo alcun senso !!
Va bene ragazzi avevano ragione. Alcune cose strane come primo carattere del mio file di input:
od -c test.txt
0000000 357 273 277 2 0 5 0 0 7 0
0000020 0 6 \n 4 0 0 9 6 0
0000040 0 2 0 \n 0 0 0 0 8
Soluzione
E 'un problema con i dati (in quanto il codice sguardi OK). Molto probabilmente avete salvato il file di testo con codifica UTF-8 con BOM. Un BOM UTF-8 è di tre byte all'inizio del file, e cercando di interpretare quelli come specifica numero decimale fallirebbe.
In secondo luogo, terza, quarta riga ecc OK perché si sta creando nuovo oggetto istringstream
per ogni linea, in modo da non trattenere modalità di errore dalla riga precedente.
Quindi, fix:. Salvare il file senza BOM - assumendo l'ipotesi è corretta BOM
Saluti e hth.,
Altri suggerimenti
Il tuo codice sembra che vada bene a me, se fossi in te avrei doppio controllo del file di input: Sei sicuro non c'è prima riga vuota, o qualche carattere non numerico sull'inizio della linea 1
Ho il sospetto che hai scritto il tuo getline()
, e il bug è lì. InputStreams hanno un getline(char*, int)
, e ho il sospetto tua string.begin()
vadano a finire nella prima param, e qualche altro numero in quest'ultima.
Non farlo.
Tutto il programma dovrebbe fare è copiare l'input per l'uscita (dato questo codice e che l'ingresso). E non sta facendo che o, anche sulle linee che "lavoro".
sto vedendo una serie di 'firme' non ha molta esperienza programmatore qui. 1) nomi eccessivamente breve variabili (una esterna per contatore di ciclo), "ss" e "p" 2) numero di errore Magic (8), in particolare uno che non distinguono dai dati. 3) "utilizzando"
1 e 3 sia accenno a una mancanza di velocità di battitura, quindi, l'esperienza ... nonostante la tua 1k + reputazione (che si basa per lo più su questioni che chiedono ... la situazione diventa più chiara).
mi piacerebbe riscrivere qualcosa di simile:
int curDig;
curLine >> curDig;
if (curLine.good()) {
cout << curDig;
} else {
cout << "FAILED at line: " << lineIdx << " containing: " << line << std::endl;
}
Le probabilità sono, si sta andando a vedere "fallito in linea: 0 contenente:". Proprio fuori dal cancello, a causa di quello che penso è un bug nel getline()