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
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top