2016-01-31 3 views
0

L'exécution de mon code se bloque quand il arrive à la fonction "atoi", mais je ne comprends pas pourquoi. Le code est censé lire une matrice à partir d'un fichier .csv, en considérant: - la première ligne (jusqu'à la première '\ n') et en sauvegardant chaque élément (séparé par un ',') dans un vecteur de ints; - le reste de la matrice, en regardant chaque élément et en créant un objet spécifique si le nombre lu est 1 ou 2. Je ne reçois aucune exception lors du débogage du programme, il plante juste pendant l'exécution (et en utilisant le système ("PAUSE") Je pouvais comprendre que c'était la fonction atoi qui ne fonctionnait pas correctement). Pouvez-vous m'aider à comprendre ce qui ne va pas? Merci beaucoup. Ps: J'ai aussi attaché toutes les bibliothèques que je suis chargement ... peut-être il peut aiderFonction Atoi lors de la lecture d'un fichier .csv C++

:)
#include <fstream> 
#include <stdio.h> 
#include <sstream> 
#define nullptr 0 
#include <string> 
#include "classi.h" 
#include <cstdlib> 
#include <stdlib.h> 
#include <iostream> 
#include <vector> 
using namespace std; 


int main(int argc, char *argv[]) { 
    ifstream file("problem.csv"); 
    unsigned int N = 0; 
    unsigned int M = 0; 
    char c; //modificato char * c; 
    unsigned int i=0,j=0, k=0, n_iter, j_temp =0; 
    std::vector<car> v_row; 
    std::vector<car> v_col_temp; 
    std::vector<int> iter; // location where I want to save the ints corresponding to the elements of the first row of the .csv file // 
    std::string iterazioni; //location where I want to save the first row as a string and then cut it into pieces (iteraz) and then convert (atoi --> iter) 
    std::string iteraz; 

    while(!file.eof()){ 
     std::getline(file,iterazioni,'\n'); 
     stringstream it(iterazioni); 
     while (it.good()) { 
      std::getline(it,iteraz, ','); 
      iter[k] = atoi(iteraz.c_str()); 
      if(iter[k]<0){ 
       cout<<"Errore: negative #of iterations"<<endl; 
       break; 
      } 
      iter.push_back(0); 
      k++; 
     } 
     iter.pop_back(); 

     file.get(c); 
     if (c=='1'){ 
      blue_car b(i,j); 
      if (v_col_temp[i].get_next() != nullptr) 
       v_col_temp[i].insert_tail(&b); 
      else 
       v_col_temp[i].insert_head(&b); 
     } 
     if (c=='2'){ 
      red_car r(i,j); 
      if (v_row[i].get_next() != nullptr) 
       v_row[i].insert_tail(&r); 
      else 
       v_row[i].insert_head(&r); 
     } 
     if (c==',') { 
      j++; 
      if (i == 0) 
       j_temp++; 
     } 
     if (c=='\n'){ 
      car p; 
      v_row.push_back(p); 
      v_col_temp.push_back(p); 
      i++; 
      if (j != j_temp) { 
       std ::cout<<"errore input non valido: numero righe/colonne non coerente"<<endl; 
      } 
      j=0; 
     } 

     else if ((c!='\n') && (c!=',') && (c!='0') && (c!='1') && (c!='2')) 
      std ::cout<<"errore input non valido"<<endl; 
    }; 
    n_iter = k-1; 
    M=i; 
    N=j+1; 

... 
+0

Vous pouvez utiliser 'strtol' pour obtenir un pointeur final pour un test d'intégrité. –

+0

Après avoir corrigé les autres problèmes, vous pouvez également prendre en compte [Pourquoi iostream :: eof est-il incorrect dans une boucle?] (Http: // stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) –

Répondre

0

plantage de votre programme parce que vous ne parvenez pas à initialiser le contenu du vecteur iter.

std::vector<int> iter; // location where I want to save the ints corresponding to the elements of the first row of the .csv file // 

Vous déclarez et construisez ce vecteur. Le vecteur est vide à ce stade, et il n'a aucun élément.

À un certain moment plus tard:

iter[k] = atoi(iteraz.c_str()); 

La valeur initiale de k est 0, cette tente d'affecter la valeur de retour atoi()-iter[0]. Le problème est, bien sûr, il n'y a pas iter[0]. Le vecteur iter est toujours vide, à ce stade.

commentaires supplémentaires, ce qui est malheureusement vrai pour au moins 50% de ce genre de questions sur stackoverflow.com:

1) "using namespace std"; est a bad practice, that should be avoided

2) N'utilisez pas system("pause") as well, comme vous l'avez mentionné dans votre question.

+0

Merci beaucoup, je vais corriger tout de suite. Malheureusement, je n'avais pas d '"instructions" à utiliser en C++ (même si je suis en train de suivre un master en ingénierie ...) donc j'ai dû tout essayer. Pouvez-vous s'il vous plaît expliquer pourquoi ils sont tous deux une mauvaise pratique, s'il vous plaît? Merci encore pour l'aide. –

+0

La raison pour laquelle c'est une mauvaise pratique est entièrement expliquée dans les articles liés. Essayez de cliquer sur les liens, et lisez plus loin. –

+0

Puis-je vous demander encore une chose? Est-il correct de dire que std :: vector iter; juste alloue de la mémoire pour un vecteur vide? (Donc, je ne devrais faire quelque chose comme: std :: vector iter (0) ou iter [0] = 0?) Merci encore! –