读取 .csv 文件 C++ 时的 Atoi 函数

Posted

技术标签:

【中文标题】读取 .csv 文件 C++ 时的 Atoi 函数【英文标题】:Atoi function while reading a .csv file C++ 【发布时间】:2016-01-31 19:52:38 【问题描述】:

当我的代码执行到“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;

...

【问题讨论】:

您可以使用 'strtol' 获取完整性测试的端点 解决其他问题后,也可以考虑Why is iostream::eof inside a loop condition considered wrong? 【参考方案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,因此这会尝试将返回值从 atoi() 分配给 iter[0]

问题当然是没有iter[0]iter 向量此时仍为空。

额外的 cmets,可悲的是,对于 ***.com 上至少 50% 的此类问题,这是正确的:

1) "使用命名空间标准";是a bad practice, that should be avoided

2) 不要使用system("pause") as well,正如您在问题中提到的那样。

【讨论】:

非常感谢,我马上解决。不幸的是,我没有使用 C++ 的“指导”(即使我正在攻读工程学硕士学位......)所以我只需要尝试一下。你能解释一下为什么它们都是不好的做法吗?再次感谢您的帮助。 链接文章中充分解释了这种做法不好的原因。尝试单击链接,然后进一步阅读。 我还能再问你一件事吗?说 std::vector iter; 是否正确?只是为空向量分配内存? (所以我应该只做类似的事情:std::vector iter(0) 或 iter[0] = 0?)再次感谢! 对不起,我正在用一个愚蠢的老黑莓阅读,看不到链接! 以下向量方法通过添加内容来增加数组的大小:push_back()、resize() 和 insert()。您可以通过阅读任何 C++ 教程找到更多信息。

以上是关于读取 .csv 文件 C++ 时的 Atoi 函数的主要内容,如果未能解决你的问题,请参考以下文章

使用 atoi 解析 csv 文件

使用 C++ 函数模板时的转换错误

C++:使用 fgetc 读取 csv 文件,并用分号“;”分隔单词

c++ 从 .csv 文件中读取

有趣的atoi()函数

如何从c ++中的文件中读取双精度