将文件中的双值数字读入 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;

【讨论】:

&gt;&gt; 运算符 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】:

如果在以下示例中声明为sistream(可能是stringstreamifstream)包含格式为[float1, float2] 的任意行数的明确定义模式 - 您可以使用流上的&gt;&gt; 运算符(在这种情况下为流提取运算符)以读取值和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++ 中的向量并访问它们的值的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件中的整数读入动态数组

将文件中的间隔整数读入 C++ 中的数组

如何将字符串中的所有数字一一读入数组(c++)

C++中的双指针向量

从文本文件中读取整数并使用 C++ 将它们存储到向量中

从 txt 文件读入向量然后按数字排序 C++