从c ++中的csv文件中读取特定的整数行

时间:2015-11-26 22:21:29

标签: c++ csv

我有一个整数表,例如:

'a

我必须从文件中读取一条确切的行,然后将其保存在动态数组中。这就是我试图读取该行但我不知道如何保存在动态数组中的方法。

1,10,100
0,1,2
3,4,5

2 个答案:

答案 0 :(得分:1)

Go2Line可以简化,以便于阅读和调试

fstream& Go2Line(fstream& file, unsigned int num)
{ 
    file.seekg(ios::beg);
    while (num > 0) // keep going until no more lines
    {
        file.ignore(numeric_limits<streamsize>::max(),'\n');
        --num; // saw a line. reduce number of lines remaining to see
    }
    return file;
}

我建议您为早期计划使用大量空间。它不会花费太多,并且很容易看到大括号排成一行。稍后当您更好地掌握语言时,请使用快捷方式。但是现在使用所有的支架,甚至是可选的支架,将它们放在自己的线上,这样它们很容易看到,并将它们排成一行,这样你就可以一目了然地看到哪些支架匹配。

下一位利用了getline使用与行尾不同的分隔符的能力。

std::stringstream convertor(line);
std::string token; // somewhere to put the comma separated value
int numtokens = 0;
while (std::getline(convertor, token, ',') 
{
    numtokens++;
}

现在我们知道我们需要多大的数组,我们可以构建数组并将数字存储在其中。我们将它们转换为std::atoi或类似的数字。

int * array = new int[numtokens];
int index = 0;
while (std::getline(convertor, token, ',') 
{
    //convert token into number with std::atoi or similar
    array[index] = std::atoi(token);
}

以后当你完成后,你需要回复array的记忆。

delete[] array;

如果您忘记或发生意外事件,这会导致问题,并阻止您到达delete[] array;的位置。

例如,如果输入行看起来像10,20,SUCKER!,30怎么办? std::atoi并不想尝试变成“SUCKER!”进入int并抛出exception。这可能会让您错过delete array

更快的方法就是拧动动态阵列。这是C ++!

std::stringstream convertor(line);
std::string token; 
std::vector<int> array; // more on this later
while (std::getline(convertor, token, ',') 
{
    array.push_back(std::atoi(token));
}

您的所有号码现在都位于std::vector内。它的大小适合,所以你不必担心在存储它们之前计算线上的数字。它还处理它自己的所有内存,所以当std::atoi抛出“SUCKER!”的异常时,vector会清除这些混乱。

我还遗漏了一些改进,以保持示例简单,所以编码很快!

答案 1 :(得分:-2)

您可以尝试这样的事情:

std::list<int> mylist;
char* data = strtok(line, ",");

while(data)
{
    mylist.push_back(atoi(data));
    char* data = strtok(NULL, ",");
}