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;
...
Vous pouvez utiliser 'strtol' pour obtenir un pointeur final pour un test d'intégrité. –
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) –