C ++ cin números ignora primera línea?
Pregunta
Me he encontrado un tema muy extraño. Puedo reproducir en mi portátil win7, así como una máquina de Ubuntu.
Tengo un programa en C ++, así:
#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;
}
Ahora, si yo compilo una carrera con ./a.out < test.txt
donde 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
Se dará salida (sin espacios):
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
¿Por qué es la primera línea de malo? He tratado de leer la primera línea de salida del bucle también.
También, si reemplazo ss > p
con cin > p
apenas consigo una tabla de salida total de 8 de.
Esto no está haciendo ningún sentido !!
Está bien que ustedes tenían razón. Algunas cosas raras como el primer carácter de mi archivo de entrada:
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
Solución
Es un problema con los datos (ya que la apariencia de código OK). Lo más probable es que haya guardado el archivo de texto con codificación UTF-8 con la lista de materiales. Una BOM UTF-8 es de tres bytes en el inicio del archivo, y tratando de interpretar los como una especificación número decimal sería un fracaso.
En segundo lugar, tercer cuarta línea, etc. bien porque va a crear nuevo objeto istringstream
para cada línea, por lo que no retener modo de error de la línea anterior.
Así, solución:. Guardar el archivo sin BOM - si se asume la hipótesis de lista de materiales es correcta ??p>
Saludos y HTH.,
Otros consejos
Su código parece bien a mí, si yo fuera usted me vuelva a revisar el archivo de entrada: ¿está seguro de que no hay primera línea vacía, o algún carácter no numérico en el inicio de la línea 1
Sospecho que escribió su propio getline()
, y el error está ahí. InputStreams tienen un getline(char*, int)
, y sospecho que su string.begin()
abarrotar en el primer parámetro, y algún otro número en el último.
No hacer eso.
Todo el programa debe hacer es copiar la entrada a la salida (dado que este código y de entrada). No es hacer que, o bien, incluso en las líneas que "el trabajo".
estoy viendo una serie de 'firmas' programador no tan experimentado aquí. 1) Nombres excesivamente corto variables (una exterior para contador de bucle), "ss" y "p" 2) número de error mágico (8), sobre todo uno que no se destaque de los datos. 3) "mediante"
1 y 3 tanto en alusión a la falta de velocidad de escritura, y por lo tanto la experiencia ... a pesar de su reputación 1k + (que se basa principalmente en hacer preguntas ... la situación se vuelve más clara).
Me había que volver a escribir algo como esto:
int curDig;
curLine >> curDig;
if (curLine.good()) {
cout << curDig;
} else {
cout << "FAILED at line: " << lineIdx << " containing: " << line << std::endl;
}
Es probable que usted va a ver "fracasado en línea: 0 que contiene:". Cabo la derecha de la puerta, por lo que creo que es un error en su getline()