簡體   English   中英

從文本文件中僅讀取浮點值

[英]Reading only float values from text file

我有一個文本格式的數據文件。 它有2個欄目,第一個對我來說可以忽略不了,第二個就是我需要的。 該coloum在每一行上具有不同的值,例如字符串,float等。對於某些計算,我只需要浮點此coloum的成員即可。 我遵循這種方式,首先聲明一個float數組並讀取值,然后使用“ >>”基本命令保存該數組。

問題是當非浮動行到來時,讀取功能會損壞。 它將非浮點值讀取為“ 0”並另存為該值。 沒關系,但是之后即使它是浮點型也將整個值讀取為“ 0”。

Datafile.txt(示例)

aa 1.1
bb 2.2
cc 3.0
dd somestring
ee 4.3
ff 4.9

代碼(示例)

 do 
{
    dfile >> a >> dat[i]; 
    ofile << dat[i]<<endl;
    cout << dat[i]<<endl;
    i++;

}while(dfile.eof());

輸出文件(示例)

1.1
2.2
3.0
0
0
0
..goes 

我想過兩種解決問題的方法。 第一個是跳過非浮動行。 第二個是在一段時間內閱讀。 因為浮點值在序列中列出。

首先閱讀一個字符串,然后嘗試轉換為數字:

std::string maybeNumber;
while (dfile >> a >> maybeNumber)
{

    std::istringstream is(maybeNumber);
    float number = 0.0f;
    if (is >> number)
    {
        dat[i] = number;
        i++;
    }    
}

(您不想使用eof 。每個人都認為他們想要使用eof ,但這幾乎永遠不是他們所需要的。請參閱此問題以獲取詳細信息。)

沒關系,但是之后即使它是浮點型也將整個值讀取為“ 0”。

您尚未顯示完整的代碼,但這聽起來像輸入流在第一個不可解析的浮點數之后處於錯誤狀態,因此它根本不會讀取任何內容。

為了解決該問題,請以std::string讀取每一行,然后將該行拆分為std::vector<std::string> 如果向量不包含兩個元素,或者第二個元素不是double ,則什么也不做,否則處理該行。

像這樣:

std::string line;
while (std::getline(dfile, line))
{
    auto const elements = parse(line);
    if (size(elements) == 2 && is_double(elements[1]))
    {
        // process
    }
}

現在,您已經在更高的抽象級別上解決了該問題,您所要做的就是實現諸如parse 類的 東西,以及實現is_double (divide&conquer)之類的東西。

還要注意,默認的C ++浮點類型是double而不是float 如有疑問,請使用double

我會使用這樣的算法:

對於文件中的每一行:

  1. 用空格分隔字符串
  2. 對於此拆分的每個結果:
    1. 可以使用正則表達式“ ^ \\ d +(\\。\\ d +)?$”
    2. 如果字符串與正則表達式匹配,則轉換為float並保存在結果數組中

使用getlineregex_token_iterator

#include <regex>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<float> v;
    std::regex reg("-?\\d+(\\.\\d+)?");
    const char* filename="myfile.txt";

    std::ifstream ifs(filename,std::ios::binary);

    for(std::string s;std::getline(ifs,s);)
       for(std::sregex_token_iterator rgi(s.begin(),s.end(),reg);rgi!=std::sregex_token_iterator();++rgi)
         v.push_back(std::stof(rgi->str());

    std::copy(v.begin(),v.end(),std::ostream_iterator<float>(std::cout," ");
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM