【问题标题】:How c++ reads the values from txt file by specific n charactersc++ 如何通过特定的 n 个字符从 txt 文件中读取值
【发布时间】:2019-11-14 21:37:02
【问题描述】:

我有一个包含许多值的文本文件,我想读取这个文件。每个值的长度为 20 个字符,例如-5.3815657119783E-04 加减号是 20 个字符,3.4684258817593E-02 在 3 前加一个空格也是 20 个字符。 在我原来的方法中,我想使用std::stringstream来实现这个功能,但是stringstream用空格分割值。

我的大部分数据都连接在一起。因此,我想每 20 个字符读取一次这个文件以形成一个值,这意味着我想通过 c++ 将数据拆分为 20 个字符,然后生成一维向量。

这是数据文件:

-5.3815657119783E-04-6.8673010013991E-01-7.5323285000788E-03
 3.4684258817593E-02 7.8204534345607E-02-9.0749590089286E-21
-3.2288090365673E-01 9.1882352987172E-02-3.6568412172092E-01
-1.6851899589453E-13-3.6952158259739E-06-1.7702955653531E-07
-1.3297325992783E-06-5.9693615642877E-04-3.8099426849223E-08
 3.4698984898706E-08-4.6509379769221E-12-2.2296405498928E-02
-5.2019999391601E-14-4.7969995006506E-08 5.6662120105254E-08
 8.9017338669484E-08-2.9332683813429E-06 1.0647933483993E-06
-6.7543843798968E-05-2.1529934384702E-03 2.2028879943185E-05
 1.1715465910941E+05-2.5234840649194E+05 1.2213290262328E+05
 6.1143067398521E-03 1.0479815336955E-04 7.8911962315577E-08
 7.2476042335761E-01 4.1208576787560E-03 0.0000000000000E+00
 5.3389720849081E-03 8.4526321374548E-05 4.8860066505864E-08
 7.1085208590414E-06 4.5249593432595E-01 4.1468076430511E-04
 5.6630655497271E-10 4.0969474876063E-11 9.7240386803972E-05
 6.5005706844622E-11 5.1549675717799E-04 8.1291425432847E-18
 3.4017603643097E-07 4.4928090110890E-03 1.8886378497020E-10
 6.2728934586839E-11 4.7522407515395E-08 3.3417538614997E-07
 1.9670991535049E-07 1.9522239039334E-08 2.7359845813293E-18

我在 c++ 中的原始代码:

std::vector<double> value;

ifstream infile;
infile.open("test-file");
int start_line_ = 0;

while (!infile.eof())
{
  string line;
  getline(infile, line);
  if(rows >= start_line_)
  {
    double number;
    std::stringstream stream(line);
    while(stream >> number)
    {
            value.push_back(number);        
    }
  }
 infile.close();
}

我的代码会将一些值连接在一起,因为它们没有被空格分隔。

【问题讨论】:

标签: c++


【解决方案1】:

因为您已经在字符串中包含该行:

for (int i = 0; i + 20 <= line.size(); i += 20) {
   double number;
   istringstream(line.substr(i, 20)) >> number;
   value.push_back(number);
}

【讨论】:

  • stringstream 是开销,std::stod 可用于子字符串
  • 也许 OP 更喜欢 stringstream API 而不是 stod。如果性能很关键,他们就不会读取人类对浮点数的表示。
  • 嗨,博杰。首先,谢谢。如果我编译了你的代码,我得到了错误:错误:无效使用不完整类型 'std::istringstream' {aka 'class std::__cxx11::basic_istringstream'} istringstream(line.substr(i, 20) ) >> 数字;
  • 您是否包含了&lt;sstream&gt; 标头?
  • 现在问题通过包含 解决了。再次感谢您。
【解决方案2】:

如果您尝试基于输入文件中的 20 个字符串构建双精度向量,您可以这样做:

#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <sstream>

int main()
{
    std::vector<double> values;
    std::ifstream infile;
    infile.open("test-file");
    std::string line;

    // Read each line into a string
    while (std::getline(infile, line))
    {
        // Iterate every 20 chars in the current line
        for (size_t i = 0; i < line.size(); i += 20) {

            // Get 20 char substring from current position,
            // put into a stringstream
            std::istringstream os(line.substr(i, 20));
            
            // Put the stringstream into a double and push this to the values vector
            double d;
            os >> d;
            values.push_back(d);
        } 
    }
    infile.close();

    // Print them to check
    for (auto& el : values)
        std::cout << el << '\n';

    return 0;
}

遍历输入中的每一行,将该行分成 20 个字符子字符串。

通过std::istringstream os 将每个子字符串转换为双精度并将其推送到std::vector&lt;double&gt;

参考文献

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 2022-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多