[英]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.