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
¿Fue útil?

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

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()

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top