我有一个整数表,例如:
'a
我必须从文件中读取一条确切的行,然后将其保存在动态数组中。这就是我试图读取该行但我不知道如何保存在动态数组中的方法。
1,10,100
0,1,2
3,4,5
答案 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, ",");
}