繁体   English   中英

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

[英]Read a specific row of integer from a csv file in c++

我有一个整数表,例如:

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

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

fstream& Go2Line(fstream& file, unsigned int num){
file.seekg(ios::beg);
for(unsigned int i=0; i < num - 1; ++i)
    file.ignore(numeric_limits<streamsize>::max(),'\n');
return file;}



int main(){ 
fstream file("testo.csv",ios_base::in);
if (!file)
    cout << "Unable to open file file.csv\n";
else
{
    int Number2Go = 1;
    Go2Line(file, Number2Go);

    if (!file)
        cout << "Unable to reach line " << Number2Go << ".\n";
    else
    {
        string line;
        getline(file,line);
        std::stringstream convertor(line);// I Don't know how continue from here

    }
}

return 0;}

可以简化 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;这会导致问题delete[] array; .

例如,如果输入行看起来像10,20,SUCKER!,30呢? std::atoi不会喜欢试图变成“SUCKER!” 转换为int并将抛出异常 这可能会让您错过delete ing 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清理混乱。

为了使示例保持简单,我还遗漏了许多改进,祝您编码愉快!

你可以尝试这样的事情:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM