读取 .csv 文件 C++ 时的 Atoi 函数
Atoi function while reading a .csv file C++
我的代码执行到 "atoi" 函数时崩溃,但我不明白为什么。
代码应该从 .csv 文件中读取矩阵,考虑到:
- 第一行(直到第一个'\n')并将每个元素(由','分隔)保存在一个整数向量中; - 矩阵的其余部分,通过查看每个元素并在读取的数字为 1 或 2 时创建特定对象。
我在调试程序时没有得到任何异常,它只是在执行过程中崩溃(并且使用系统("PAUSE")我可以弄清楚它是 atoi 函数没有正常工作)。
你能帮我理解出了什么问题吗?
非常感谢你。
Ps:我还附上了我正在加载的所有库...也许它可以帮助 :)
#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;
...
您的程序崩溃,因为您未能初始化 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 //
您声明并构造此向量。此时矢量为空,没有任何元素。
稍后:
iter[k] = atoi(iteraz.c_str());
k
的初始值是0,所以这尝试将return的值从atoi()
赋给iter[0]
。
问题是,当然没有iter[0]
。此时 iter
向量仍然是空的。
补充评论,遗憾的是,whosebug.com 上至少有 50% 的此类问题是正确的:
1) "using namespace std";是 a bad practice, that should be avoided
2) 不要使用 system("pause") as well,正如您在问题中提到的那样。
我的代码执行到 "atoi" 函数时崩溃,但我不明白为什么。 代码应该从 .csv 文件中读取矩阵,考虑到: - 第一行(直到第一个'\n')并将每个元素(由','分隔)保存在一个整数向量中; - 矩阵的其余部分,通过查看每个元素并在读取的数字为 1 或 2 时创建特定对象。 我在调试程序时没有得到任何异常,它只是在执行过程中崩溃(并且使用系统("PAUSE")我可以弄清楚它是 atoi 函数没有正常工作)。 你能帮我理解出了什么问题吗? 非常感谢你。 Ps:我还附上了我正在加载的所有库...也许它可以帮助 :)
#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;
...
您的程序崩溃,因为您未能初始化 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 //
您声明并构造此向量。此时矢量为空,没有任何元素。
稍后:
iter[k] = atoi(iteraz.c_str());
k
的初始值是0,所以这尝试将return的值从atoi()
赋给iter[0]
。
问题是,当然没有iter[0]
。此时 iter
向量仍然是空的。
补充评论,遗憾的是,whosebug.com 上至少有 50% 的此类问题是正确的:
1) "using namespace std";是 a bad practice, that should be avoided
2) 不要使用 system("pause") as well,正如您在问题中提到的那样。