Question

J'ai couru dans un problème vraiment étrange. Je peux reproduire sur mon ordinateur portable win7 ainsi qu'une machine à ubuntu.

J'ai un programme C ++ comme ceci:

#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;
}

Maintenant, si je le compiler une course avec ./a.out < test.txttext.txt contient:

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

Il sortira (sans espaces):

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

Pourquoi est la première ligne de mal? J'ai essayé de lire la première ligne de la boucle ainsi. De plus, si je remplace ss > p avec cin > p Je viens d'obtenir une table de sortie complète de 8 de.

Cela ne fait aucun sens !!

Ok les gars ont raison. Certains trucs bizarres comme le premier caractère de mon fichier d'entrée:

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
Était-ce utile?

La solution

Il est un problème avec les données (puisque le code semble correct). Très probablement, vous avez enregistré votre fichier texte avec encodage UTF-8 avec BOM. Un BOM UTF-8 est de trois octets au début du fichier, et d'essayer d'interpréter ceux comme une spécification de nombre décimal échouerait.

Deuxième, troisième, quatrième ligne etc. OK parce que vous créez nouvel objet istringstream pour chaque ligne, afin de ne pas retenir le mode d'erreur de la ligne précédente.

Alors, fix. Enregistrez le fichier sans nomenclature - en supposant l'hypothèse de la nomenclature est correcte

Vive et HTH.

Autres conseils

Votre code semble bien pour moi, si je vous avais je vérifier deux fois fichier d'entrée: êtes-vous sûr qu'il n'y a pas première ligne vide, ou un caractère non numérique au début de la ligne 1

Je soupçonne que vous avez écrit votre propre getline(), et le bug est là. InputStreams ont une getline(char*, int), et je soupçonne votre bachotage string.begin() dans le premier param et un autre numéro dans ce dernier.

Ne pas faire.

Tout votre programme devrait faire est de copier l'entrée à la sortie (étant donné ce code et cette entrée). Il est ne fait pas non plus, même sur les lignes que « le travail ».

Je vois un certain nombre de programmeur expérimenté Not So « signatures » ici. 1) les noms de variables excessivement courte (en dehors d'un compteur de boucle pour), « ss » et « p » 2) le nombre d'erreurs magique (8), en particulier celle qui ne se distingue pas de données. 3) "en utilisant"

1 et 3 à la fois allusion à un manque de vitesse de frappe, et par conséquent l'expérience ... malgré votre 1k + réputation (qui repose principalement sur poser des questions ... la situation devient plus claire).

Je réécrire quelque chose comme ceci:

int curDig;
curLine >> curDig;
if (curLine.good()) {
  cout << curDig;
} else {
  cout << "FAILED at line: " << lineIdx << " containing: " << line << std::endl;
}

Les chances sont, vous allez voir « ECHEC à la ligne: 0 contenant: ». À droite de la porte, en raison de ce que je pense est un bug dans votre getline()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top