将文件中的双值数字读入 C++ 中的向量并访问它们的值
Posted
技术标签:
【中文标题】将文件中的双值数字读入 C++ 中的向量并访问它们的值【英文标题】:Read double values numbers from a file into a vector in C++ and access their values 【发布时间】:2017-02-21 08:44:20 【问题描述】:我正在尝试将存储在同一行中的两个双精度值从文本文件或 csv 文件中读取到一个向量中,并用逗号分隔。数字以这种格式存储,如下所示 [1688.37, 115.14]。我想从文件中读取这些数字,然后存储在数组中,以便可以访问第一个和第二个数字。我的代码编译但不会显示数字。这里是 C++ 中的代码。
ifstream file("C:/arrow1.txt",ios::app);
double s;
std::vector<double> data;
while(file>>s)
data.push_back(s);
for(int i=0; i<data.size(); i++)
std::cout<<data[i]<<std::endl;
此代码读取并显示数字,但与字符串在同一行。那我不知道怎么访问第一个和第二个号码
ifstream fh("C:/arrow1.csv",ios::app);
std::vector<std::string> vs;
std::string s;
while(fh>>s)
vs.push_back(s);
for(int i=0; i<vs.size(); i++)
std::cout<<vs[i]<<std::endl;
有什么帮助吗?
【问题讨论】:
能否添加示例文件内容并正确格式化代码。 我不明白我应该添加什么? ? 不得不说文件中存储的数字是未知的。 A 它们来自其他程序的输出,但我不知道输出会是什么。 【参考方案1】:您可以将第二次尝试与atof()
(Have a look here) 结合使用。它将string
转换为double
。
将第一个数字复制到第二个字符串中,然后使用atof()
获取您的双精度值。
例子:
// Your copied values from the file
std::string s1 = "[1688.37,";
std::string s2 = "115.14]";
// Copy the number without "[" and ",", the length of the number is variable
std::string str1 = s1.substr(1, s1.length()-1); // Copy the first number in str1
double firstNum = atof(str1.c_str());
cout << firstNum << endl;
// Copy the second number without "]"
std::string str2 = s2.substr(0, s2.length()-1); // Copy the second number in str2
double secondNum = atof(str2.c_str());
cout << secondNum << endl;
【讨论】:
>>
运算符 std::string
使用空格来解析文本。因此,使用 OP 的示例“[1688.37, 115.14]”,在第二个代码示例中添加到向量中的 std::string
实例将是“[1688.37”和“115.14]”。所以,此时字符串还没有准备好atof()
。
我尝试过使用 atof() 时出错。谁能给我正确的代码如何使用它?
@GigaRohan 这就是为什么我建议将数字复制到第二个字符串中。我认为这是摆脱 [],
的最简单方法
但是如果我复制第二个字符串中的数字,我会得到 [1688.37,.那么如何去掉“[”和“,”呢?
好的。知道了。在这种情况下 std::string s1 = vs[0]; std::string s2 = vs[1];【参考方案2】:
如果在以下示例中声明为s
的istream
(可能是stringstream
、ifstream
)包含格式为[float1, float2]
的任意行数的明确定义模式 - 您可以使用流上的>>
运算符(在这种情况下为流提取运算符)以读取值和get
调用以读取,
、[
、]
和newline
字符,如下例所示:
std::vector<double> fpvec;
char c;
double in;
while( s.eof() == false)
s.get(c);
s >> in;
fpvec.push_back(in);
s.get(c);
s >> in;
fpvec.push_back(in);
s.get(c);
s.get(c);
// Print last two inserted elements - testing purposes only
unsigned int size = fpvec.size();
std::cout << fpvec[size-2] <<" and "<< fpvec[size-1] << std::endl;
【讨论】:
@user3035413 - 我猜没有 '['、',' 和 ']' 字符?如果只有一行用逗号分隔两个双精度并且该行用 [ 和 ] 包裹,则输出应为“1688.37 和 115.14”。看看这个:tutorialspoint.com/… @user3035413 你得到了 fpvec 向量中的数字!这不是你要求的吗?? 是的。感谢@ll 提供有价值的答案 @user3035413 ifstream 和 stringstream 都以 istream 为基础,我提供的代码可以与它们中的任何一个一起使用。 对不起。还有一件事。如果文件有两行两个数字,代码将如何。假设文件格式是这样的 [1874.2, 244.465] [1453.13, 246.315]。第一行是 [1874.2, 244.465],第二行是 [1453.13, 246.315]。所以看起来像矩阵 2x2以上是关于将文件中的双值数字读入 C++ 中的向量并访问它们的值的主要内容,如果未能解决你的问题,请参考以下文章